我有以下代码:
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 *传递给此函数。如何重写我的代码才能使其正常工作?
答案 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读入字符数组的线程。