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

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

4

3 回答 3

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

如果它正在执行操作,您甚至不需要返回值。如果你这样做了,别忘了在完成后释放它。

于 2010-01-26T17:37:46.663 回答
0

您对 sPPhase 的描述:

char *sPPhrase[51];

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

char sPPhrase[51];

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

scanf("%s",sPPhrase)

另请注意,您的 scanf 可能比您预期的要多。

于 2010-01-26T17:41:45.830 回答
0

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

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

这样做是将整个数组设置为“A”,因此该数组的内存地址为“A”。这是内存中的垃圾值。当您打电话时,scanf("%s", *sPPhrase);您只是通过尝试将每个数组的顶部设置为等于一个字母来增加问题。所以你会得到垃圾。

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

于 2010-01-26T17:47:30.750 回答