对这个简单的程序有点麻烦。我可以通过将响应[10]作为全局变量来解决这个问题,但我不想这样做。编程测试正确的响应并且工作但返回字符串是垃圾:
#include <stdio.h>
#include <string.h>
char *user_string(char *Setting_Type[]);
int main()
{
char *response;
char *test_names[2] = {"Test", "test"};
printf("Enter \"Test\" or \"test\": ");
response = user_string(test_names);
printf("\nCorrect! Your input is: %s\n", response);
return 0;
}
char *user_string(char *Setting_Type[])
{
int loop = 1;
char response[10];
char *response_string;
while(loop = 1)
{
scanf("%s", &response);
response_string = response;
if(strcmp(response_string, Setting_Type[0]) != 0 && strcmp(response_string, Setting_Type[1]) != 0)
printf("\nWrong! Please try again: ");
else
break;
}
return response_string;
}
答案 0 :(得分:1)
您的scanf()
功能需要编辑
来自scanf("%s", &response);
至scanf("%s", response);
这将解决部分问题。
由于您不想使用全局变量,为什么不在
中添加另一个参数 char *user_string(char *Setting_Type[], char *response_string)
?
你必须为它分配内存,并在调用函数(main()
)中释放它,但它可以在这种情况下工作。 (真的应该为它提供一些记忆,无论如何,在它目前的用法中)
示例: [已测试,有效]
#include <ansi_c.h>
#include <stdio.h>
#include <string.h>
char *user_string(char *Setting_Type[], char *s);
int main()
{
char *response;
char *test_names[2] = {"Test", "test"};
char *resp;
resp = malloc(80);//I picked 80, you can pick something more appropriate
response = malloc(80);//I picked 80, you can pick something more appropriate
printf("Enter \"Test\" or \"test\": ");
//user_string() returns a char *, so just call it in printf()
printf("\nCorrect! Your input is: %s\n", user_string(test_names, response));
free(resp);
free(response);
return 0;
}
char *user_string(char *Setting_Type[], char *response_string)
{
int loop = 1;
char response[10];
while(loop == 1)
{
scanf("%s", response); //removed &
strcpy(response_string,response);//changed from `=` to `strcpy()`
if(strcmp(response_string, Setting_Type[0]) != 0 && strcmp(response_string, Setting_Type[1]) != 0)
printf("\nWrong! Please try again: ");
else
break;
}
return response_string;
}
答案 1 :(得分:0)
response
是user_string()
的本地数组,当函数返回时它将超出范围,您不能在main()
处使用它。您需要在malloc()
中为user_string()
内存提供main()
内存,或从{{1}}传入缓冲区。关于这个问题的很多很多重复。
答案 2 :(得分:0)
您正在返回本地数组的地址,该地址在return语句后停止存在。
此行scanf("%s", &response);
也引入了缓冲区溢出的可能性。