2016-08-08 36 views
1

文字列を受け取り、2次元配列で格納するプログラムを作成しました。また、配列内の文字列(ユーザーが入力したもの)を検索する関数も用意されています。しかし、プログラムを実行するたびに、検索部分に達すると機能しなくなります。誰も私のエラーを指摘できますか?文字列の配列から文字列を検索する

は、ここでまた

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

がしてきたはずです

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

をしてきたはずです私のコード

#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'として自分の名前を入力した場合、あなたのプログラムは'%s'形式の 'scanf'のマニュアルページによって漏洩された理由で動作しません。 –

+0

配列内で検索される文字列を受け入れます。 @Downvoter –

答えて

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

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は配列の境界チェックをしていないため、1次元の配列です。多次元配列の場合にのみ重要なので、コンパイラーは索引付けを理解することができます。 –

+0

ありがとうございました!ほんとうにありがとう。 –

+0

'そして、提案:scanfの代わりに[fgets]を使う'なぜ? 'scanf'は正しく使用すると完全に安全です。 'scanf'の問題は、間違って使われていることです。説明してください – Michi

関連する問題