0

我一直在解决 strncmp 和 getline 的问题……所以 ai 做了一个小测试应用程序。strncmp 给出误报,我无法弄清楚我做错了什么。

这是程序

#include <stdio.h>

FILE *fp=NULL;
char uname[4]="test";
char *confline=NULL;
size_t conflinelength=0;
int datlength;

main()
{
    datlength=4;
    fp=fopen("test.txt","r+");
    while (getline(&confline,&conflinelength,fp)!=-1)
    {
        if (strncmp(confline,uname,(datlength-1))==0);
        {
            printf("match\n");
            return;
        }
    }
    printf("no match\n");
    fclose(fp);
}

这是“test.txt”...

bjklas

和程序输出

match
4

4 回答 4

4
if (strncmp(confline,uname,(datlength-1))==0);
    printf("match\n");

相当于

if (strncmp(confline,uname,(datlength-1))==0)
    ;
printf("match\n");

您需要;从行尾if删除

于 2013-10-15T22:16:08.047 回答
3
if (strncmp(confline,uname,(datlength-1))==0);
                                             ^ roh-roh
于 2013-10-15T22:16:21.457 回答
0

如果您使用char uname[5]="test";此行,将自动附加 '\0',使其成为 C 字符串,但仅分配了 4 个空格,它不能。相反,它是一个未终止的字符数组......

char uname[4]="test";导致一组未终止的字符,即不是 C 字符串。即“|t|e|s|t|”
这将编译,但它不能被某些字符串函数(strcmp、strlen 等)处理,从而导致运行时错误。

建议char uname[]="test"; 这将自动处理附加 NULL 终止符以产生 C 字符串:“|t|e|s|t|\0|”。此方法是初始化 char 数组的首选方法。

于 2013-10-15T22:31:30.273 回答
0

我猜这是您输入分号时的错字;在 if 条件而不是其语句的末尾,即在曲线括号 } 之后

出于兴趣,我更喜欢使用 fgets,因为 getline 不在标准 C 库中

于 2013-10-15T22:34:44.977 回答