Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从字符串数组中搜索字符串_C - Fatal编程技术网

C 从字符串数组中搜索字符串

C 从字符串数组中搜索字符串,c,C,我创建了一个接受字符串并将其存储在二维数组中的程序,它还有一个在数组中搜索字符串(由用户输入)的函数。但每当我运行程序时,当它到达搜索部分时,它就会停止工作。有人能指出我的错误吗 这是我的密码 #include <stdio.h> #include <string.h> #define maxname 40 #define maxlength 70 int acceptSize() { int sizeOf; printf("How many s

我创建了一个接受字符串并将其存储在二维数组中的程序,它还有一个在数组中搜索字符串(由用户输入)的函数。但每当我运行程序时,当它到达搜索部分时,它就会停止工作。有人能指出我的错误吗

这是我的密码

#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!");
}
#包括
#包括
#定义maxname 40
#定义最大长度70
int acceptSize()
{
国际尺寸;
printf(“有多少学生?”);
scanf(“%d”&sizeOf);
返回sizeOf;
}
无效接受名称(字符名称[maxname][maxlength],整数大小)
{
国际中心;
对于(ctr=0;ctr
应该是

char sname[]; // See comment#1 by weather-vane
if(strcmp(names[ctr2], sname)==0) // sname[maxname] is not a string, sname is !!

应该是

char sname[]; // See comment#1 by weather-vane
if(strcmp(names[ctr2], sname)==0) // sname[maxname] is not a string, sname is !!
最后

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

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

和一个建议:使用而不是scanf


使用

使用调试器。但是您期望的是什么
scanf(“%s”,&sname[maxlength])
应该做什么?检查
scanf
系列的返回值是很重要的,即使打字机上没有猴子,我们都会输入错误。它返回成功读取的项目数。而您对预期的输入或输出没有任何线索。例如,如果我以
天气风向标的身份输入我的名字,您的程序将无法运行k、 由于使用
%s
格式的
scanf
手册页泄露的原因,它接受将在数组中搜索的字符串。@Downvoterit可能接受将在数组中搜索的字符串中的一个单词。
&sname[maxlength]
是字符串结尾的地址,因此会导致缓冲区溢出。字符串的开头应该是
&sname[0]
+1但你的第一点是,函数不关心你告诉它的数组长度,因为C没有数组边界检查。这只对多维数组很重要,因此编译器可以计算出索引。非常感谢你的输入!我非常感谢。
还有一个建议:使用[fgets]而不是scanf
为什么?
scanf
在正确使用时是完全安全的。
scanf
的问题是使用错误。请explain@Michi使用fgets可以处理无效输入,例如键盘上的猴子。你甚至可以搜索用户输入的每个单词。它更灵活,更容易识别没有scanf会导致的错误。irover-很好的链接。@Michi:fgets是出于回答中提到的原因而提出的。