C: 格式 %s 在有趣的字符串程序中需要 char* 类型的参数
C: Format %s expects argument of type char* in funny strings program
我正在制作一个程序来检查有趣的字符串。理解练习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]);
虽然我不明白为什么。
我的目标是制作一个字符串数组,称为字符串,并将我读取的所有字符串存储在那里。为什么 strings[i] 是一个 char** ?
如有任何帮助或提示,我将不胜感激。
谢谢!
显然你有一个 char *
并且你正在传递它的地址,这是错误的,scanf()
想要每个 "%s"
说明符的 char
指针,以及修复你的代码是使用
char string[10];
scanf("%s", string);
像上面那样传递给 scanf()
时,数组自动成为 char
指针,但这还不够。
你的 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()
的return值,它returns NULL
失败并取消引用 NULL
指针是未定义的行为,您必须小心不要导致未定义的行为,因为它太难调试了。
我正在制作一个程序来检查有趣的字符串。理解练习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]);
虽然我不明白为什么。
我的目标是制作一个字符串数组,称为字符串,并将我读取的所有字符串存储在那里。为什么 strings[i] 是一个 char** ?
如有任何帮助或提示,我将不胜感激。
谢谢!
显然你有一个 char *
并且你正在传递它的地址,这是错误的,scanf()
想要每个 "%s"
说明符的 char
指针,以及修复你的代码是使用
char string[10];
scanf("%s", string);
像上面那样传递给 scanf()
时,数组自动成为 char
指针,但这还不够。
你的 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()
的return值,它returns NULL
失败并取消引用 NULL
指针是未定义的行为,您必须小心不要导致未定义的行为,因为它太难调试了。