2010-01-26 64 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读入字符数组的一个线程。

相关问题