需要写一个字符串常量,我该如何解决这个问题呢?

时间:2010-01-26 17:36:20

标签: c pointers cstring

我有以下代码:

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[]);

字符串常量不可写,但我需要将此char *传递给此函数。如何重写我的代码才能使其正常工作?

3 个答案:

答案 0 :(得分: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);

如果它正在进行操作,您甚至不需要返回值。如果你这样做,请不要忘记在完成后将其释放。

答案 1 :(得分:0)

你的sPPhase的脱离:

char *sPPhrase[51];

实际上是51个指针的数组。 你真正想要的只是一个字符数组:

char sPPhrase[51];

当你这样做时,你应该改变scanf

scanf("%s",sPPhrase)

另请注意,您的scanf读取的内容可能超出预期。

答案 2 :(得分:0)

要理解这一点,您需要回到数组在内存中的实现方式。 char* sPPhrase[51];是指向指针的指针,您可以将其视为类似于二维数组。如果您声明并调用scanf读入它,则将整个数组的值设置为等于一个字符。这就像说:

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

这样做是将整个数组设置为'A',以便数组的内存地址为'A'。这是内存中的垃圾值。当你调用scanf("%s", *sPPhrase);时,你只是试图将每个数组的顶部设置为一个字母来增加问题。所以你得到了垃圾。

Here是一个描述如何使用scanf读入字符数组的线程。