比较C语言中的令牌与字符串

3

我从文件中读取了一个由两个单词组成的字符串,使用分隔符将它们分开,并希望将它们与我的输入进行比较。第一次比较正常工作,但第二次不行。打印语句输出相同的内容,但检查失败。我猜测这是由于特殊的换行符造成的。

if(strcmp(argv[2], token[0]) == 0){
    printf("Input1 match\n");
    printf("%s\n", argv[3]);
    printf("%s\n", token[1]);
    if(strcmp(argv[3], token[1]) == 0)
    {
        printf("Input2 match\n");
    }
}

编辑:我的第二个token中有一个 \n字符,使用下面代码修剪字符串可以解决:

void strip(char *s) {
    char *p2 = s;
    while(*s != '\0') {
        if(*s != '\t' && *s != '\n') {
            *p2++ = *s++;
        } else {
            ++s;
        }
    }
    *p2 = '\0';
}

1
如果您发布进行标记化的代码,您可能会得到更好的答案。那很可能是问题所在。 - Samuel Edwin Ward
1个回答

6
将你的打印语句更改为:
printf("[%s]\n", argv[3]);
printf("[%s]\n", token[1]);

要确定它们是否真的相同,您可能会发现令牌末尾有一个“隐藏”的字符,例如<space>\n

如果即使使用该方法也无法显示,请通过十六进制转储程序将输出导入,如果您有可用的话(a),可以使用类似于以下内容的东西:

./myprog | od -xcb

然后,您可以检查输出中是否存在可疑字符。


(a) 如果您使用的是Windows操作系统,gVim菜单上有“转换为十六进制”的选项,或者您可以安装Cygwin或GnuWin32工具,例如od


如果这是一个非打印字符,这可能不会有所帮助。将输出导入到“hexdump”或打印“strlen”可能会更加详细。 - Samuel Edwin Ward
它是一个换行符,所以它会显示在输出中。修剪它可以解决这个问题。谢谢。 - Danson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接