2013-10-26 99 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個字符進入響應[10],其餘的用於標準輸入? – Samuel

+0

不客氣,謝謝你的接受!在'user_string()'中,響應[10]可以從標準輸入中讀取_up到_ *** 9 ***個字符,必須有一個結束符爲'\ 0'scanf()'從標準輸入,期望它符合格式字符串,在這種情況下爲「%s」,並且如果它有空間的話,會在該輸入中附加'\ 0'。一個非致命警告「嘗試超出字符串寫入」會在您輸入10個(或更多)字符時發生,如果您將strcpy()放入指針(如response_string)中,則發生致命錯誤。嘗試使用此代碼,並在調試中使用中斷點,以便查看變量。 – ryyker

0

response是本地user_string()一個數組,它會走出去的範圍在該函數返回的那一刻,你不能用它main(),在這裏。您需要在user_string()中輸入malloc()內存,或從main()傳入緩衝區。 SO上的這個問題有很多很多重複的部分。

0

您正在返回本地數組的地址,該地址在返回語句後會停止存在。

此行scanf("%s", &response);也引入了緩衝區溢出的可能性。需要

+1

更不用說它應該寫成'scanf(「%s」,response);'(no&for char *) – ryyker

+0

@ryyker自從'&response == response'以來,它都可以工作。 – this