【问题标题】:Unexpected output in file handling文件处理中的意外输出
【发布时间】:2015-02-17 08:31:21
【问题描述】:

我的输入文件是这个

1001
1001
1101
1109

我有以下代码-

char line[4];    
while(fgets(line,5,input)!=NULL)
 {
   printf("%s",line);

 }

它给了我正确的输出如下-

1001
1001
1101
1109

但是如果我把我的代码修改成这个-

while(fgets(line,5,input)!=NULL)
 {
   printf("%s",line);
   for(i=0;i<4;i++)
    {
     int c=line[i]-'0';
     printf("% d   ",c);     
    }printf("\n");   
 }

我现在得到奇怪的答案-

1001 1    0    0    1   

-38   -48    0    1   
1001 1    0    0    1   

-38   -48    0    1   
1101 1    1    0    1   

-38   -48    0    1   
1009 1    0    0    9   

-38   -48    0    9  

为什么在我的第二种情况下会出现这种奇怪的输出?

【问题讨论】:

  • while(fgets(line,5,input)!=NULL) --> while(fgets(line,sizeof(line),input)!=NULL)
  • 结果和以前一样
  • 第一个示例与显示的输出不匹配。新线从何而来?还将 5 个 chars 读入 4 个 chars 的数组会引发未定义的行为。
  • 如何为第二个示例定义line?如果与第一次一样,任何事情都可能发生,原因:请参阅我之前的评论。
  • 它应该给了我正确的答案。”你从什么地方得到这个想法? char * line 只是一个指向空的指针。要将 4 个字符和一个换行符读入 C-“字符串”,您需要提供至少 4+1+1 chars。第六个char是存储C-“字符串”的0-终止符,需要标记它的结束。

标签: c file fgets


【解决方案1】:

您的 char 数组有 4 个元素,而您尝试将 5 个元素 [考虑到空终止符] 放入其中。

这样,您访问的内存越界,会产生未定义的行为。

另外,值得一提的是,fgets() 读取并存储 换行符。你需要自己处理。

【讨论】:

  • 我尝试了您的建议,但结果仍然相同,而不是 -38 现在是 -32。但我不知道这些值来自哪里
  • 他有什么建议? @Coder
  • 不应该是 (4 chars + 1 newline + 1 null) 吗?
  • 是的,将大小增加到 6 有效,但为什么会这样?null 应该在最后一行,而不是在任何其他行
  • 那是另一个问题。 Point 1. 这样,你需要在使用之前为line分配内存。第 2 点。sizeof() 返回 数据类型 的大小,而不是分配的内存量 (if)。
【解决方案2】:

与:

int c=line[i]-'0';

您只是将一位数字转换为 int,但您想转换整个数字字符串:

int c= 0;
char *cp= line;
while (isdigit(*cp)) c= c*10 + *cp++ - '0';

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 2014-04-04
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多