strncmp()给出了误报

时间:2013-10-15 22:13:30

标签: c getline strncmp

我一直在使用strncmp和getline来解决这个问题...所以我做了一个小测试应用程序。 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 个答案:

答案 0 :(得分:4)

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

相当于

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

您需要从;

的末尾删除if

答案 1 :(得分:3)

if (strncmp(confline,uname,(datlength-1))==0);
                                             ^ roh-roh

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

我猜这是你输入分号时的拼写错误;在if条件的末尾而不是它的陈述,即在曲线括号之后}

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