C:格式%s要求程序中的参数类型为char*
我正在制作一个程序来检查有趣的字符串。理解这个练习 我的代码在这里:C:格式%s要求程序中的参数类型为char*,c,string,scanf,C,String,Scanf,我正在制作一个程序来检查有趣的字符串。理解这个练习 我的代码在这里: #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--) {
#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;
}
我不明白为什么
我的目标是创建一个字符串数组,称为字符串,并将我读取的所有字符串存储在那里。为什么字符串[i]是字符**
如果有任何帮助或提示,我将不胜感激
谢谢 显然,您有一个
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]);
char字符串[5][10];
int i;
对于(i=0;i<5;++i)
scanf(“%9s”,字符串[i]);
注意:例如,当您传递int
值时,您需要运算符的&
地址,因为scanf()
修改了传递的指针指向的数据,所以您需要在要扫描该值的int
变量处创建一个指针,为此,您使用运算符的&
地址,因为您传递了一个包含变量地址的指针
建议:始终检查
malloc()
的返回值,它在失败时返回NULL
,并且取消引用NULL
poitner是未定义的行为,您必须小心不要导致未定义的行为,因为这太难调试。strings[i]
不是char**
,但是&strings[i]
是.Inchar*reversedStr=malloc(strlen(str))
你没有足够的空间,你忘记了空终止符in很有趣
如果字符串实际上比MAX_stru长度短会发生什么?更糟糕的是,OP的字符串
只是一个未初始化的指针--他从不分配任何内存来保存字符串或指针,所以它们都是悬空的。@chrisdsodd你是对的,如果它们是数组,那么类型就不会是char**
。我为什么要使用char string[10]?我想声明字符串数组,而不是字符串。然后使用char strings[NumberOfStrings][NumberOfCharacters]
。好的,谢谢。像您所说的那样声明字符串数组与像char**strings=?