即使字符串不相等,strncmp也会给出0-C

问题描述

我在C语言中遇到strncmp函数的情况,即使单词不匹配也返回0,在下面的示例中,我正在用字母'R'进行测试并在运行代码时即使txt文档中的比较词为“ RUN”,它也会返回0。你碰巧知道是否

我在strncmp函数中或代码中的其他地方缺少什么吗?

谢谢您的输入。


bool lookup(string s);

int main(void) {

char *s;
s = "R";
if (lookup(s)) {
    printf("Word found =)\n");
} else {
    printf("Word not found =(\n");
}
}

// Looks up word,s,in txt document.
bool lookup(string s)
{
 // Todo
    char *wordtosearch;
    wordtosearch = s;
    int lenwordtosearch = strlen(wordtosearch);
    char arraywordindic[50];

// Open txt file
FILE *file = fopen("text.txt","r");
if (file == NULL)
{
    printf("Cannot open file,please try again...\n");
    return false;
}

while (!feof(file)) {
    if (fgets(arraywordindic,50,file) != NULL) {
        char *wordindic;
        wordindic = arraywordindic;
        int result = strncmp(wordindic,wordtosearch,lenwordtosearch);
        if (result == 0) {
            printf("%i\n",result);
            printf("%s\n",wordindic);
            printf("%s\n",wordtosearch);
            fclose(file);
            return true;
        }
    }        
}
fclose(file);
return false;
}

解决方法

int result = strncmp(wordindic,wordtosearch,lenwordtosearch);

如果lenwordtosearch的前wordtosearch个字符与字典中任何单词的前lenwordtosearch个字符相匹配,这将为您提供零。

假设您要搜索的单词是S,则词典中以开头的{em> S开头的单词都会为您提供匹配。

您可能应该检查 entire 一词。这可能意味着清理您从文件中读取的单词(即删除换行符)并改用strcmp(),例如:

wordindic = arraywordindic;

// Add this:
size_t sz = strlen(wordindic);
if (sz > 0 && wordindic[sz - 1] == '\n')
    wordindic[sz - 1] = '\0';

// Modify this:
// int result = strncmp(wordindic,lenwordtosearch);
int result = strcmp(wordindic,wordtosearch);
,

问题是它将R与RUN进行比较,得出0。我希望它 仅找到R时返回0。

在这种情况下,您需要使用功能strcmp比较整个单词,而不是使用功能lenwordtosearch仅比较strncmp个字符。

请注意,函数fgets可以将换行符'\n'附加到输入的字符串中。您需要先删除它,然后再比较字符串。

if (fgets(arraywordindic,50,file) != NULL) {
    arraywordindic[ strcspn( arraywordindic,"\n" ) ] = '\0';
    int result = strcmp(arraywordindic,wordtosearch);
    if (result == 0) {
        printf("%i\n",result);
        printf("%s\n",arraywordindic);
        printf("%s\n",wordtosearch);

这些声明的结果

int lenwordtosearch = strlen(wordtosearch);

char *wordindic;
wordindic = arraywordindic

可能会被删除。

while循环的条件应写为

while ( fgets(arraywordindic,file) != NULL ) {
    arraywordindic[ strcspn( arraywordindic,wordtosearch);
    //...