C 某些输入而非其他输入上的分段故障

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

下面是我编写的一个函数,其中已经有一些调试元素。当我输入“y”或“y”作为输入时,在运行时会出现分段错误。当我输入任何其他值时,代码将运行。seg故障在扫描并给出响应后,但在输出“扫描已工作”行之前,退出。我不知道为什么只有这些值才会这样。如果有人需要函数调用,我也有

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);