2016-08-08 118 views
1

我創建了一個接受字符串並將它們存儲在二維數組中的程序,它還有一個函數用於在數組中搜索字符串(由用戶輸入)。但是每當我運行程序時,它在到達搜索部分時都會停止工作。任何人都可以指出我的錯誤?從字符串數組中搜索字符串

這裏是我的代碼

#include <stdio.h> 
#include <string.h> 
#define maxname 40 
#define maxlength 70 

int acceptSize() 
{ 
    int sizeOf; 
     printf("How many students?"); 
     scanf("%d",&sizeOf);  
    return sizeOf; 
} 

void acceptNames(char names[maxname][maxlength],int size) 
{ 
    int ctr; 
    for(ctr=0; ctr<size; ctr++) 
    { 
     printf("Student %d:", ctr+1); 
     scanf("%s",&names[ctr]); 
    } 

} 

int searchName(char names[maxname][maxlength], char sname[maxname]){ 
    int ctr2; 
     for(ctr2=0; ctr2<maxname; ctr2++) 
     { 
      if(strcmp(names[ctr2], sname[maxname])==0) 
      { 
       return ctr2; 
      } 
     } 
    return -1; 
} 

int main(){ 
    int ctr,size, choice, result; 
    char names[maxname][maxlength], sname[maxlength]; 

    size=acceptSize(); 
    acceptNames(names,size); 
    printf("Enter name to be searched: "); 
    scanf("%s", &sname[maxlength]); 
    result=searchName(names, sname); 
    if(result == -1) 
     printf("Match is not found."); 
    else 
     printf("Match is found!"); 
} 
+2

使用調試器。但是你期望什麼'scanf(「%s」,&sname [maxlength]);'應該這樣做? – Downvoter

+0

即使在打字機上沒有猴子,檢查來自'scanf'家族的返回值是*基本*,我們都會輸入錯誤。它返回成功讀取的項目數。而且你不知道預期的輸入或輸出。例如,如果我輸入「Weather Vane」作爲我的名字,那麼您的程序將無法工作,原因是'scanf'的手冊頁以'%s'格式泄露了原因。 –

+0

它接受將在數組中搜索的字符串。 @Downvoter –

回答

3
char sname[maxname] // in int searchName() 

應該已經

char sname[]; // See comment#1 by weather-vane 

而且

if(strcmp(names[ctr2], sname[maxname])==0) 

應該已經

if(strcmp(names[ctr2], sname)==0) // sname[maxname] is not a string, sname is !! 

終於

scanf("%s", &sname[maxlength]); 

shoud've一直

scanf("%s", sname); // reading a string is a case where you could omit & 

和建議:使用[ fgets ]代替scanf函數

使用

+1

+1但是你的第一個觀點,一個函數並不在乎你說的數組長度,因爲C沒有數組邊界檢查。這對於多維數組非常重要,因此編譯器可以計算出索引。 –

+0

非常感謝您的意見!對此,我真的非常感激。 –

+0

'建議:使用[fgets]代替scanf'爲什麼是這樣?使用正確時,'scanf'是完全安全的。 'scanf'的問題是使用錯誤。請解釋一下 – Michi