【问题标题】:reading string from a file in c从c中的文件中读取字符串
【发布时间】:2013-03-02 07:57:52
【问题描述】:

我有一个这样的输入文件:

1 2 2 Medium 
1 2 0 Medium
2 1 0 Medium
2 0 2 Medium

我正在使用 fscanf() 来读取整数值,并且工作正常。有谁知道如何读取字符串并将其放入字符串变量中???

int x,y,z; 
char* cs; 
fscanf(fp3,"%d",&x); 
fscanf(fp3,"%d",&y); 
fscanf(fp3,"%d",&z); 
fscanf(fp3,"%s",&cs);

【问题讨论】:

  • 如果你没有把它读入一个“字符串变量”,我会有点担心。
  • 与 %s 一样吗?并使用 char*。
  • 为什么不发布您正在使用的 fscanf 函数调用的代码 sn-p ?
  • int x,y,z;字符* cs; fscanf(fp3,"%d",&x); fscanf(fp3,"%d",&y); fscanf(fp3,"%d",&z); fscanf(fp3,"%s",&cs);
  • 扫描字符串不起作用。我遇到运行时错误

标签: c string file


【解决方案1】:

您需要已经分配的空间来存储字符串。试试这样的:

int x,y,z; 
char cs[20];
fscanf(fp3,"%d",&x); 
fscanf(fp3,"%d",&y); 
fscanf(fp3,"%d",&z); 
fscanf(fp3,"%19s",cs);

您也可以一次扫描所有值:

fscanf(fp3,"%d %d %d %19s", &x, &y, &z, cs);

注意:始终在 scanf 模式中使用 %<length>s 以防止缓冲区溢出。

【讨论】:

  • 我不认为'cs'应该和&,它是一个数组。
  • 使用strcmp。尽管您必须在 char 数组上做一些指针巫术。比如,使用&cs[0] 而不是cs。 char* 的普通字符串很好。所以:strcmp(str1, &cs[0]);
  • 请注意,您应该测试 fscanf 的返回值。如果不是 4,则某些转换失败或到达文件末尾。
  • 您可以在一条指令中读取输入(我更喜欢它):if (fscanf(fp3, "%d%d%d%s", &x, &y, &z, cs) != 4) /* error */;
【解决方案2】:

注意两件事:

  • 您需要保留一个缓冲区来将字符串复制到其中。
  • 也永远不要使用普通的“%s”scanf 模式。应该禁止。而是在% 和s 之间插入缓冲区的长度,减1。例如,“%7s”表示 8 字节缓冲区。

【讨论】:

    【解决方案3】:

    要说的两件事:

    1. 使用one格式字符串会更好看
    2. 您应该使用循环

    这里有一些代码:

    int a,b,c;
    char str[256];
    while(fscanf(fd, "%d %d %d %s ", &a, &b, &c, str) == 4){
        //get some coffee
    }
    

    这是一个标准的 while 不是 End of File 循环。此外,str 不需要&,因为它已经是一个指针,不需要像a、b 或c 那样被引用。格式字符串末尾的空格,在%s 之后,意味着一旦读取了一个空格,它将停止。这样它就不会包含在字符串str中。

    【讨论】:

    • 这是未定义的行为; str 未初始化且无处指向。这就是 OP 得到未处理异常的原因。
    • 更好地测试转化次数而不是EOF
    • 修正了我的答案,也运行了它。
    • 你可以用str代替&str[0]
    • 是的,刚刚使用str 运行它就可以了。我不确定 C 是否关心数组指针和普通指针。
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多