2010-01-26 71 views
0

我有以下代碼:需要寫入字符串常量,我該如何解決這個問題?

int main() { 
    char *sPPhrase[51]; 

    /* Input */ 
    printf("Enter string (max. 50 chars):\n"); 
    fflush(stdout);       /* Works around an annoying Eclipse bug that fails to display the output from the printf command */ 
    scanf("%s", *sPPhrase); /* Won't work */ 

    /* More code goes here */ 
} 

scanf()命令失敗,我想,是因爲* sPPhrase不可寫的sPPhrase指向一個字符串常量。編譯器沒有任何錯誤的線索。過了一會兒,我需要把這個字符串傳遞給這個函數:

char* reverse(char* sPPhrase[]);

的字符串常量是不可寫的,但我需要通過這個字符*到這個功能。如何重寫我的代碼以使其工作?

回答

6

您正在聲明一個指針數組,而不是一個字符數組(通常用作字符串)。

需要聲明是這樣的:

char sPPhase[51]; 

此外,sscanf的可以給你帶來麻煩:它更好地用fgets在界緩衝區讀取一個字符串:

int main() { 
    char sPPhrase[51]; 
    printf("Enter string (max. 50 chars):\n"); 
    fflush(stdout); 
    fgets(sPPhrase, 50, stdin); // leave one byte for '\0' 

    // More code 
} 

我不'不知道'逆向'在做什麼,但你應該將其定義爲:

char* reverse(char* sPPhrase); 

如果是在做歌劇就地安置,你甚至不需要返回值。如果你這樣做,當你完成後不要忘記釋放它。

+0

並將scanf更改爲scanf(「%s」,sPPhrase); – 2010-01-26 17:39:20

+0

還需要將scanf更新爲scanf(「%s」,sPPhrase) – zebrabox 2010-01-26 17:42:04

+0

那麼我該如何調用函數?'字符* sPReverse =反向(sPPhrase);'生成此錯誤: 「從兼容的指針類型傳遞'反向」的ARG 1」 – Pieter 2010-01-26 18:35:09

0

你sPPhase的decaration:

char *sPPhrase[51]; 

實際上是51個指針數組。 你真正想要的只是一個字符數組:

char sPPhrase[51]; 

當你這樣做,你應該改變的scanf

scanf("%s",sPPhrase) 

另外請注意,您可能scanf函數讀超過你的期望。

0

要理解這一點,您需要回到數組如何在內存中實現。 char* sPPhrase[51];是指向指針的指針的聲明,您可以將其看作類似於二維數組。如果聲明並調用scanf來讀取它,則將整個數組的值設置爲等於一個字符。這就好比說:

char chars2D[50][50]; 
chars2D[0] = 'A'; 

這是什麼東西做的是設置整個數組等於「A」,所以數組的內存地址爲「A」。這是內存中的垃圾值。當你打電話給scanf("%s", *sPPhrase);時,你只是試圖將每個數組的頂部設置爲一個字母而使問題倍增。所以你會得到垃圾。

Here是描述如何使用scanf讀入字符數組的一個線程。