C 某些输入而非其他输入上的分段故障
下面是我编写的一个函数,其中已经有一些调试元素。当我输入“y”或“y”作为输入时,在运行时会出现分段错误。当我输入任何其他值时,代码将运行。seg故障在扫描并给出响应后,但在输出“扫描已工作”行之前,退出。我不知道为什么只有这些值才会这样。如果有人需要函数调用,我也有C 某些输入而非其他输入上的分段故障,c,segmentation-fault,user-input,C,Segmentation Fault,User Input,下面是我编写的一个函数,其中已经有一些调试元素。当我输入“y”或“y”作为输入时,在运行时会出现分段错误。当我输入任何其他值时,代码将运行。seg故障在扫描并给出响应后,但在输出“扫描已工作”行之前,退出。我不知道为什么只有这些值才会这样。如果有人需要函数调用,我也有 query_user(char *response [10]) { printf("response after query call before clear=%s\n",response); strcpy(re
query_user(char *response [10])
{
printf("response after query call before clear=%s\n",response);
strcpy(response,"");
printf("response after clearing before scan=%s\n",response);
printf("Enter another person into the line? y or n\n");
scanf("%s", response);
printf("response after scan=%s\n",response);
printf("scan worked");
}
main()
{
char response [10];
strcpy(response,"y");
printf("response=%s\n",response);
printf("When finished with program type \"done\" to exit\n");
while (strcmp(response,"done") != 0)
{
printf("response after while loop and before query call=%s\n",response);
query_user(&response);
}
}
错误时的输出:
response after query call before clear=y
response after clearing before scan=
Enter another person into the line? y or n
y
response after scan=y
Segmentation Fault (core dumped)
清除之前的查询调用后的响应=y
扫描前清除后的响应=
请另一个人排队?是还是不是
Y
扫描后的响应=y
分段故障(堆芯转储)
无错误时的输出:
response after query call before clear=y
response after clearing before scan=
Enter another person into the line? y or n
n
response after scan=n
scan worked
Cycle number 0
(program continues to run outside this function)
清除之前的查询调用后的响应=y
扫描前清除后的响应=
请另一个人排队?是还是不是
N
扫描后的响应=n
扫描成功了
循环编号0
(程序继续在此功能之外运行)
您对
query\u user
的参数声明错误。您已经声明了指向char
的指针数组。您需要一个简单的字符缓冲区。像这样:
query_user(char response[])
或
用你喜欢的
调用函数时,可以按如下方式执行:
query_user(response);
我还要指出,您对main
的声明是不正确的。你应该使用
int main(void)
你所做的不是完全安全的 如果用户的磁带超过了您的标签的大小,会发生什么情况?(可能是断层) 您真的应该使用scanf(“strong>%9s”,response)(之后必须清空缓冲区!): (选项卡大小为10的示例):
希望有帮助 首先,您发布的代码不会重现问题。我用GCC4.6.2在Linux上进行了测试,用VisualStudio2010在Windows上进行了测试。在这两种情况下,使用您的精确代码,我的输出是: 响应=y
完成程序后,键入“完成”退出
while循环之后和查询调用之前的响应=y
清除前查询调用后的响应=y
扫描前清除后的响应=
请另一个人排队?y或n
y
扫描后的响应=y
在while循环之后和查询调用之前扫描workedresponse=y
清除前查询调用后的响应=y
扫描前清除后的响应=
请另一个人排队?是还是不是 因此,为了更好地诊断,我们需要一套完整的代码来显示这个问题。发布的代码中有很多警告(不确定这些警告是否也在您的库中),有时忽略警告会让您陷入困境:
应返回main
:int
int main()
- 在main的末尾添加一个return
return0代码>
需要query\u user
返回类型:void
void query\u user()
接受一个strcpy
您正在给它一个char*
char**
query_user(response); // remove the & operator
而query\u user()
的标题需要更改,例如:
query_user(char response [10]) // remove the * operator
还要注意的是,scanf将在stdin
上留下一个'\n'
字符,以确保您不会在%s
前面留下一个空格:
scanf(" %s", response);
我不认为这会有什么大的不同,但要确保你做出了改变。请发布实际显示错误的代码更新。为什么要将10个指针数组传递给
query\u用户
?我不认为那是你想做的。您还应该显示调用该函数的代码,以及文本缓冲区的内存分配。main(){char response[10];strcpy(response,“y”);printf(“response=%s\n”,response);printf(“当完成程序类型\“done\”以退出\n”);while(strcmp(response,“done”)!=0){printf(“while循环之后和查询调用之前的响应=%s\n”,response);查询用户(&response);我会尝试的。感谢您的支持,我在格式化方面遇到了问题。我尝试更改声明中的参数并清除了调用。仍然是相同的问题,输入y或y时出现seg错误,但输入n或n时没有。我在那里有保护装置,并在排除故障时将其删除。仍然试图找出错误原因,仅限于来自y或y输入,而不是n。我试图发布更多代码,但它不让我,一直告诉我它格式错误。
query_user(char response [10]) // remove the * operator
scanf(" %s", response);