-1

这是我编写的一个函数,其中已经包含一些调试元素。当我输入“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);
    }
}

错误输出:

在 clear=y 之前查询调用后的响应
扫描前清除后响应=
让另一个人进入队列?是或否
是的
扫描后的响应=y
分段错误(核心转储)

非错误输出:

在 clear=y 之前查询调用后的响应
扫描前清除后响应=
让另一个人进入队列?是或否
n
扫描后的响应=n
扫描工作
循环数 0
(程序在这个函数之外继续运行)
4

3 回答 3

2

您对参数的声明query_user是错误的。您已经声明了一个指向char. 您需要一个简单的字符缓冲区。像这样:

query_user(char response[])

或者

query_user(char* response)

使用任何你喜欢的。

当你调用这个函数时,你可以这样做:

query_user(response);

另外我要指出你的声明main是不正确的。你应该使用

int main(void)
于 2012-12-13T10:40:21.987 回答
0

您正在做的事情并不完全安全。

如果用户磁带超过标签的大小会发生什么?(可能是段错误)。

你真的应该使用类似 scanf(" %9s ", response) 的东西(你必须在它之后清空缓冲区!):

(标签大小 = 10 的示例):

query_user(char *response)
{
    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("%9s", response);
    clean_buffer();
    printf("response after scan=%s\n",response);
    printf("scan worked");
}

void clean_buffer()
{
   int c;
   while ((c = getchar ()) != '\n' && c != EOF);
}

希望能帮助到你 !

于 2012-12-13T11:01:57.010 回答
0

首先,您发布的代码不会重现问题。我在 Linux 上使用 Gcc 4.6.2 和在 Windows 上使用 Visual Studio 2010 进行了测试。在这两种情况下,使用您的确切代码,我的输出是:

响应=y
完成程序类型“完成”以
在while 循环之后和查询调用之前退出响应=y查询调用之后的响应
clear=y
扫描之前清除之后的响应=
输入另一个人进入该行?y 或 n
y扫描后的
响应=y
扫描后的响应 while 循环后和
查询调用之前的响应=y 查询调用后的响应 clear=y
扫描前清除后的响应=
输入另一个人进入该行?是或否

因此,为了更好地诊断,我们需要一套完整的工作代码来显示这个问题。发布的代码有很多警告(不确定这些是否也在你的基础中),有时忽略警告会让你陷入困境:

  • main应该返回intint main()
  • 最后在你的 main 中放一个 returnreturn 0;
  • query_user需要一个void返回类型:void query_user()
  • strcpy需要char *你给它char **

对于最后一点,您可以通过将数组传递给您的函数来修复它,例如:

 query_user(response); // remove the & operator

并且您的标题query_user()需要更改,例如:

 query_user(char response [10]) // remove the * operator

另请注意, scanf 将'\n'在 上留下一个字符stdin,以确保您不会消耗可以在 之前放置一个空格%s

scanf(" %s", response);

我不认为这会产生很大的不同,但请确保你做出改变。请发布实际显示错误的代码更新。

于 2012-12-13T13:07:18.447 回答