从函数返回字符串会产生垃圾

时间:2013-10-26 03:56:49

标签: c string scanf

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

3 个答案:

答案 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)

responseuser_string()的本地数组,当函数返回时它将超出范围,您不能在main()处使用它。您需要在malloc()中为user_string()内存提供main()内存,或从{{1}}传入缓冲区。关于这个问题的很多很多重复。

答案 2 :(得分:0)

您正在返回本地数组的地址,该地址在return语句后停止存在。

此行scanf("%s", &response);也引入了缓冲区溢出的可能性。