【问题标题】:Strcmp not returning 0strcmp 不返回 0
【发布时间】:2016-01-21 02:09:56
【问题描述】:

我有一个如下所示的文本文件:

TEMP:88
TT:33
3d;3d:5

我试图只解析第一行,并检查它确实是“TEMP:88”

这是我尝试过的:

FILE * file = fopen("test.txt","r");

if(file == NULL)
    exit(0);
char buff[128];

while(fgets(buff,sizeof(buff),file) != NULL) {
     if(strcmp(buff,"TEMP:88") == 0) 
         printf("TRUE");
     else
         printf("FALSE"); //prints false, regardless of newline character, use of memcopy or anything else
     break;
}

然后我尝试在strcmp中添加换行符“\n”,结果相同,mem copy也产生了相同的结果,有什么想法吗?

【问题讨论】:

  • 尝试打印buff的内容(最好打印ascii码)
  • 打印正确的字符串“TEMP:88”
  • \n应该被包括在内;考虑到这一点,比较在这里按预期工作:ideone.com/WY3OHM
  • 如果在字符串中包含换行符没有修复它,可能是行尾有空格。
  • 或者根据您使用的系统类型,您的文件是否实际上包含TEMP:88\r\n,带有回车符和换行符?我赞同@BryanChen 的建议,打印出字符的数值。

标签: c string file parsing


【解决方案1】:

来自下面的源代码

FILE * file = fopen("test.txt","r");
if(file == NULL)
    exit(0);
char buff[128];

while(fgets(buff,sizeof(buff),file) != NULL) {
    printf("%s,%d\n",buff,strlen(buff));
    int i= 0;
    while(i<strlen(buff))
    {
        printf("%d\n",buff[i]);
        i++;
    }
    if(strcmp(buff,"TEMP:88") == 0) 
        printf("TRUE");
    else
        printf("FALSE"); //prints false, regardless of newline character, use of memcopy or anything else
    break;
}

结果是,

$ ./a.exe TEMP:88 ,9 84 69 77 80 58 56 56 13 10 假

此 ASCII 值和字符串长度表明您读取的字符串不是“TEMP:88”。 读取缓冲区末尾包含 LF 和 CR 的 ASCII 值。

所以你可以使用

strncmp(buff,"TEMP:88",strlen("TEMP:88"));

【讨论】:

  • 你不应该在输出中得到 13,除非你在非 Windows 操作系统下打开一个 Windows 文本文件
  • 我知道。我只想告诉他“strncmp”
  • strncmp 的这种用法也可以匹配"TEMP:886",例如
【解决方案2】:

只是为了补充上述 cmets 之一,引用以下链接:

http://www.cplusplus.com/reference/cstdio/fgets/

换行符使 fgets 停止读取,但它被认为是 函数的有效字符并包含在复制到的字符串中 字符串。

所以是的,您应该在比较中包含 \n

【讨论】:

  • 问题说包含换行符并没有使它起作用。
  • 只是想知道在这种情况下,行尾字符是否不是 Windows CRLF 而不是 LF 字符。也许这会导致比较失败
  • 那是另一种可能性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
相关资源
最近更新 更多