2013-10-15 67 views
0

我一直在使用strncmp和getline过期问题......所以我做了一个小测试应用程序。 strncmp给出了误报,我无法弄清楚我做错了什么。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 
+0

'炭UNAME [4] = “test”;'可以作为'datlength = 4',但建议'char uname [] =“test”;'。 'printf(“match \ n”);'后面应该跟'fclose(fp);'。 – chux

回答

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

相当于

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

您需要从if线

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

的末尾删除;如果你要使用char uname[5]="test";该行会自动加上“\ 0”,使其成为一个C字符串,但用只分配了4个空间,它不能。相反,它是一个未终结的字符数组...

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

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

0

我猜这是你输入分号时的错字;在if条件,而不是它的语句,即,右后的曲线托架}

出于兴趣结束时,我宁愿使用与fgets因为函数getline不是在标准C库

+0

你是指_if行(strncmp(confline,uname,(datlength-1))== 0); _? – ryyker