2011-03-19 20 views
1

我已經編寫了以下C代碼以獲取來自用戶的字符串列表。但存儲的字符串正在發出奇怪的值。從C中的用戶採集的字符串正在被加擾

#include <stdio.h> 
#include <stdlib.h> 


#define MAX_STRING_LENGTH 50 


void readInStrings(char* arr[],int n) 
{ 
    int i=0; 
    char line[MAX_STRING_LENGTH]; 

    for(i=0;i<n;i++){ 
    arr[i]=malloc(MAX_STRING_LENGTH); 
    printf("Enter another string : "); 
    scanf("%s",&arr[i]); 
    //fgets(&arr[i],MAX_STRING_LENGTH,stdin); 
    } 



    printf("Strings read in correctly.... \n"); 

    printf("Displaying out all the strings: \n"); 
    for(i=0;i<n;i++){ 
    printf("%s\n",&arr[i]); 
    } 
} 



void testStringInputs() 
{ 
    printf("Enter the number of entries : "); 
    int n; 
    scanf("%d",&n); 

    char* strings[n]; 
    readInStrings(strings,n); 
} 

輸入採樣:

輸入的條目數:3
輸入另一個字符串:阿拉丁
輸入另一個字符串:奧巴馬
輸入另一個字符串:字符串讀取正確.. ..
顯示出所有的字符串:
AllaBaraObama
BaraObama
個 奧巴馬

問題: 1)爲什麼是一個字符串沒有采取作爲輸入呢?
2)爲什麼顯示的字符串像這樣亂碼?

如果我使用gets()或fgets()代替scanf(),問題是一樣的。

+1

如果您在答案中給出了更正,那麼fgets是一個更安全的選項。您可以輕鬆地使用scanf(和%s)溢出緩衝區或獲取。 – jonsca 2011-03-19 05:04:24

+0

如果我在printf語句中不使用&arr [i],程序崩潰。即使使用fgets(),問題仍然存在,字符串出現亂碼。並且循環的輸入的一次迭代也被跳過。 – 2011-03-19 05:15:41

回答

1

卸下&(作爲第一回答者指出)在scanf("%s",&arr[i]);printf("%s\n",&arr[i]);奏效了我。此外,請注意,如果您編譯的警告是最高的,那麼編譯器會立即告訴您,&錯位。

+0

你能告訴我爲什麼當我使用它時,跳過了一個fgets()的迭代? scanf()工作正常。 – 2011-03-19 06:38:31

+1

在'scanf('%d',&n);'in'testStringInputs()''後面加一個'getchar();'當你輸入「3 」時,3被存儲在n中, n'在輸入流中,函數中的第一個fgets將其作爲一行輸入來挑選 – jonsca 2011-03-19 06:46:17

+0

是的,這很有效,謝謝。有沒有一個地方可以讓我學會避免輸入/輸出中的更多這些陷阱C?一本書或一個網站? – 2011-03-19 07:07:16

4

ARR [i]是已指針,則不需要&

1

其更好地使用數組的數組(二維),而不是指針數組。 我很難糾正你的代碼。所以我改變了代碼,這

#include <stdio.h> 
#include <stdlib.h> 
#define MAX_STRING_LENGTH 50 
void readInStrings(char (*arr)[MAX_STRING_LENGTH],int n) 
{ 
    int i; 
    for(i = 0 ; i< n+1; ++i) 
    fgets(*(arr+i),MAX_STRING_LENGTH,stdin); 
    printf("Strings read in correctly.... \n"); 
    printf("Displaying out all the strings: \n"); 
    for(i=0;i< n+1;i++){ 
    printf("%s",arr[i]); 
    } 
} 
int main() 
{ 
    printf("Enter the number of entries : "); 
    int n; 
    scanf("%d",&n); 
    char strings[n][MAX_STRING_LENGTH]; 
    readInStrings(strings,n); 
    return 0; 
} 
+0

但是,一串字符串是一個指針數組,不是嗎?我知道你的解決方案是這樣做的一種方式,但如果可能的話,我想成爲......在概念上是乾淨的。 – 2011-03-19 06:37:16

相關問題