我编写了一个代码,用C对文件中的数据进行标记。如果当前标记等于SIOL,我想打印一些数据。我的问题是strcmp无法正常工作。您能发现任何错误吗?这是代码。谢谢您的帮助

int main()
{
    FILE* fp;

    char  line[1024];
    char *val1;

    fp = fopen("sample1.txt" , "r");
    while (fgets(line, sizeof(line), fp) != NULL)
    {
        val1 = strtok(line, " ");
        if (strcmp(val1,"SIOL")==0)
        {
            printf("Sucess!");
            return 0;
        }
        else
        {
            while(val1)
            {
                printf("%s\n", val1);
                val1=strtok(NULL, " ");
            }
        }
    }
}


像这样的sample1.txt:

HAHA
SIOL
Hello World!
SIOL
123 4 345 65 756 867 789797
Hello World

最佳答案

您的实现中的问题是它没有正确地处理\n

fgets遇到'\n'字符时,它将作为字符串的一部分返回。因此,当标记化时,文件中的两个"SIOL"字符串都将作为"SIOL\n"返回到程序中,因为它们都在字符串的末尾。 strcmp认为"SIOL""SIOL\n"彼此不相等,因此它返回一个非零值。

要解决此问题,请将'\n'添加到程序接受的定界符列表中:

val1 = strtok(line, " \n"); // change the second call of strtok as well


这样可以确保strtok在令牌末尾消除'\n',并将干净的令牌传递回给您。

关于c - 无法比较 token ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33720134/

10-13 06:25