0

这个简单的程序有点麻烦。我可以通过将 response[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;
}
4

3 回答 3

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;
}
于 2013-10-26T04:23:13.977 回答
0

response是一个局部于 的数组user_string(),函数返回的那一刻它就会超出范围,你不能从main(), 这里使用它。您需要在 中malloc()为它存储内存user_string(),或者从main(). SO上这个问题的很多很多重复。

于 2013-10-26T03:58:47.597 回答
0

您正在返回一个本地数组的地址,该地址在 return 语句之后不再存在。

此行还scanf("%s", &response);介绍了缓冲区溢出的可能性。

于 2013-10-26T03:59:01.873 回答