2013-10-26 2 views
0

Имея небольшую проблему с этой простой программой. Я могу решить это, сделав ответ [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

ли вы имеете в виду использовать оператор присваивания в условном операторе? 'while (loop = 1)'. Должно ли быть ?: 'while (loop == 1)' – ryyker

+0

В вашем коде было несколько проблем, в основном связанных с обработкой строк, проблемами с областью, распределением и освобождением памяти. К большому счету в этом комментарии. См. Мой ответ ниже. – ryyker

+0

@Blastfurnace - Не соглашайтесь с определенной причиной, так как OP не включает этот вопрос в свой запрос. Я согласен с тем, что он задает вопрос, непосредственно относящийся к корневой проблеме области видимости, но, как и многие другие, которые являются новыми для C, область не находится на переднем крае того, что он наблюдает. Изучение сферы действия в конечном итоге решит его проблему, но на данный момент изучает причины, по которым строка искажается, а методы работы со строками, работающими или не работающими с вызовом функции для возврата, являются достаточной причиной для того, чтобы этот вопрос оставался активным , – ryyker

ответ

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; 
} 
+0

Благодарим вас за подробный ответ. Я просто узнаю о malloc и не совсем понимаю его вообще. Не вводит ли пользователь только десять символов в ответ [10], а остальные идут на stdin? – Samuel

+0

Добро пожаловать, спасибо, что согласились! В 'user_string()' ответ [10] может принимать _up to_ *** 9 *** chars из stdin, должен быть один левый для nul-терминатора '\ 0' 'scanf()' вводит данные из stdin , ожидая, что он будет соответствовать строке формата «% s» в этом случае и добавит «\ 0» к этому вводу, если в нем есть место. Предупреждение о неустранимости «Попытка написать за строкой» возникает, если вы вводите 10 (или более) символов и фатальную ошибку, если вы «strcpy()», что у вас есть, в указатель (например, response_string). Попробуйте это с помощью этого кода и используйте точку прерывания при отладке, чтобы вы могли просматривать переменные. – ryyker

0

response массив локальный для user_string(), он будет выходить за рамки тот момент, когда функция возвращает, вы не можете использовать его из main(), здесь. Вам нужно либо malloc() памяти для него в user_string(), либо передать в буфер от main(). Много, много дубликатов этого вопроса на SO.

0

Вы возвращаете адрес локального массива, который останавливается после оператора return.

Также эта строка scanf("%s", &response); вводит возможность переполнения буфера.

+1

Не говоря уже о том, что это должно быть написано 'scanf («% s », response);' (no & for char *) – ryyker

+0

@ryyker Он работает в обоих направлениях с '& response == response'. – this

Смежные вопросы