【问题标题】:Help! strcmp is lying to me when fed strtok results帮助!当输入 strtok 结果时,strcmp 对我说谎
【发布时间】:2011-01-08 00:45:01
【问题描述】:

strcmp,当输入 strtok 的结果时,下面的代码似乎在公然对我撒谎。

int fSize;
char * buffer=NULL;
char * jobToken = "job";
char * nextToken=NULL;
job * curJob=NULL;
struct node * head=NULL;
struct node * parseList(FILE* file){
    fseek(file,0,SEEK_END);
    fSize=ftell(file);
    buffer = (char*)malloc(fSize+1);
    printf("%d chars: reading buffer now:\n",fSize);
    fseek(file,0,SEEK_SET);
    fread (buffer,1,fSize,file);
    nextToken = strtok(buffer, " \n");
    while (nextToken!=NULL){
            printf("**Running  Token: %s**\n",nextToken);
            if (strcmp(nextToken,jobToken)){
                    printf("Accepted %s  as %s\n",nextToken,jobToken);                
            }else{
                    printf("not %s, %s\n",jobToken,nextToken);
            }

            printf("End of state - %s\n",nextToken);

            nextToken = strtok(NULL, " \n");
    }
    free (buffer);
    return NULL;
}

在 parseList 参数中的文件中使用此输入:

job 23
job 10

给出这个输出:

14 chars: reading buffer now:
**Running  Token: job**
not job, job
End of state - job
**Running  Token: 23**
Accepted 23  as job
End of state - 23
**Running  Token: job**
not job, job
End of state - job
**Running  Token: 10**
Accepted 10  as job
End of state - 10

谎言!

【问题讨论】:

    标签: c string strtok strcmp


    【解决方案1】:

    与您的问题无关,但有几点:

    • fread()后面要设置buffer[fSize] = 0;,否则不是字符串。
    • 使用fseek(file,0,SEEK_END);isn't guaranteed to work 确定要在文本文件或二进制文件中读取的字符数。

    就个人而言,我会将malloc() 调用写为:

    buffer = malloc(fSize+1);
    

    因为如果我忘记#include <stdlib.h>,它会警告我,并且更容易阅读。 C 中不需要强制转换。

    【讨论】:

      【解决方案2】:

      strcmp 在字符串相等时返回 0。 见:http://www.elook.org/programming/c/strcmp.html

      【讨论】:

        【解决方案3】:

        strcmp 在您比较的字符串相等时返回 0。您需要使用if (!strcmp(...))

        【讨论】:

        • Raaaage!谢谢,现在看来很明显了。
        • 我更喜欢明确地与 0 进行比较;它减少了将结果解释为布尔值的机会。我对access 做同样的事情,几乎所有其他零表示成功的事情。
        • 我喜欢#define streq(s1,s2) (strcmp((s1), (s2)) == 0),因为它把语义概念融入了名字
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        相关资源
        最近更新 更多