2013-10-15 66 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