2016-08-08 83 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