我正在制作一个程序来检查有趣的字符串。要理解练习read this。
我的代码在这里:
#define MAX_STR_LENGTH 10
char* reverse(char *str) {
char *reversedStr = malloc(strlen(str));
for (int i = 0; i < MAX_STR_LENGTH; i++) {
for (int j = MAX_STR_LENGTH - 1; j > 0; j--) {
reversedStr[i] = str[j];
}
}
return reversedStr;
}
int isFunny(char *str, char *reversedStr) {
for (int i = 1; i < MAX_STR_LENGTH; i++) {
if (str[i] - str[i - 1] != reversedStr[i] - reversedStr[i - 1]) {
return 0;
}
}
return 1;
}
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int numberOfStrings;
scanf("%i", &numberOfStrings);
char **strings;
for (int i = 0; i < numberOfStrings; i++) {
scanf("%s", &strings[i]);
}
char **reversedStrings;
for (int i = 0; i < numberOfStrings; i++) {
reversedStrings[i] = reverse(strings[i]);
}
for (int i = 0; i < numberOfStrings; i++) {
if (isFunny(strings[i], reversedStrings[i])) {
printf("Funny\n");
}
printf("Not funny\n");
}
return 0;
}
我得到的错误如下:
solution.c: In function 'main':
solution.c:35:9: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char **' [-Wformat=]
scanf("%s", &strings[i]);
我不明白为什么。
我的目标是创建一个字符串数组,称为字符串,并存储我读取的所有字符串。为什么字符串[i]是char **?
我将不胜感激任何帮助或提示。
谢谢!
答案 0 :(得分:3)
显然你有一个char *
并且你传递了它的地址,这是错误的,scanf()
想要一个char
指针用于每个"%s"
说明符,并且代码的修复是使用
char string[10];
scanf("%s", string);
如上所述,当传递给char
时,数组会自动成为scanf()
指针,但这还不够。
你的char
阵列现在正如我所说它的大小是固定的,即使它不是,使用scanf()
就像是危险的,假设数组中的每个数组都是char
数组包含10
个元素,然后您想要阅读的每个字符串必须只包含9
个字符,您可以指示scanf()
在已读取9
时停止阅读像这样的字符
scanf("%9s", strings[i]);
如果你不这样做,那么读取额外的字符将是可能的,但是非法的,导致所谓的未定义的行为。
如果你想要一个字符串数组,比如5
个字符串,每个字符串9
,那么你可以试试
char strings[5][10];
int i;
for (i = 0 ; i < 5 ; ++i)
scanf("%9s", strings[i]);
注意:例如,当您传递&
值时,需要运算符的int
地址,因为scanf()
修改了指向的数据通过传递的指针,所以你需要创建一个指向你要扫描值的int
变量的指针,因为你使用运算符的&
地址,因为你传递一个包含变量的地址。
建议:始终检查malloc()
的返回值,失败时返回NULL
,取消引用NULL
poitner,是未定义的行为,你必须小心不要导致未定义的行为,因为它太难调试。