2013-11-20 16 views
0

我正在寫一個讀取字符列表(使用重定向)的代碼,但是我將字符存儲的字符串的大小爲41.字符數不會接近數組的大小,因此我需要使用malloc()以獲得確切的數組大小。當我不使用malloc函數打印數組時,打印符號和其他亂碼以及字符串。我需要malloc的字符串,所以符號和胡言亂語不會被包括在內。如何將malloc()函數用於char字符串/數組?

代碼:

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

int main() { 

    char c; 
    char r1[41]; 
    int a = 0; 

    while(scanf("%c", &c) != EOF) { 
     if(c >= 'A' && c <= 'Z' || c == '[' || c == '.' || c == '!') { 
     r1[a] = c; 
     a++; 
     } 
    } 

    printf("\nThe string is: %s\n", r1); 

return 0; 
} 

輸出:

The string is TR[!.DFQ▒ ▒ ▒ 這 
+2

'NUL'終止符... – 2013-11-20 21:21:10

+2

您的'string'是一個42個指向'char'的數組。你想'字符串[40 + 1];'。 (當然,您需要在其中存儲一些值。) –

+0

該代碼中沒有任何內容從任何地方讀取任何值。因此,你的'string'數組的內容未初始化,這導致了未定義的行爲...... – twalberg

回答

2

有混合在這裏匯聚一對夫婦的困惑點。

  1. 您的代碼打印亂碼的原因不是由於固定長度和可變長度。切換到malloc()不會解決這個問題。確保你在字符串末尾有一個空終止('\0'):

    while(scanf("%c", &c) != EOF) { 
        ... 
    } 
    
    r1[a] = '\0'; 
    
  2. 你原來的代碼混合陣列和指針語法。對於單個字符串,您應該使用char[]char*,但不能同時使用這兩種字符串。

    對於固定大小的串,其聲明爲:

    char string[40+1]; 
    

    對於可變長度的字符串,做到:

    char *string = malloc(length + 1); 
    
    if (string == NULL) { 
        fprintf(stderr, "malloc failed\n"); 
        exit(EXIT_FAILURE); 
    } 
    
    // memory allocation successful 
    
+0

我剛開始使用聲明:char string [40 + 1]。我認爲如果我展示我的整個代碼將是最好的。 –

+0

我調試了很多次,當我使用數組的確切大小時,符號和亂碼沒有打印。所以這是額外的索引導致的符號和胡言亂語。 –

+0

@TomMurphy不,它不是。這是由缺失的NUL終止子引起的未定義的行爲。要謙虛,不要試圖比指出並解決你明顯的初學者錯誤的人更聰明。 – 2013-11-20 21:57:08

1
char *string[40+1]; 

string定義爲一個陣列41指針char。如果你想讓它保持一個字符串,你會想要將它定義爲:

char string[40+1]; 

如果你知道(在運行時,而不是在編譯時)將字符串有多長,你可以使用malloc - 但是你要結果分配給char*類型的單個指針:

char *s = malloc(len + 1); 
if (s == NULL) { 
    /* malloc failed, handle the error */ 
} 

這導致s指向的char陣列的第一(第0個)元件。該數組未初始化,因此您需要將一些數據複製到其中。

一旦你做到了這一點,並假設該內容是正確空值終止,然後您使用可打印字符串的值:

printf("The string is: \"%s\"\n", string); 

comp.lang.c FAQ是這種事情的絕佳資源。

相關問題