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]
是.In
char*reversedStr=malloc(strlen(str))
你没有足够的空间,你忘记了空终止符in
很有趣
如果字符串实际上比MAX_stru长度短会发生什么?更糟糕的是,OP的
字符串
只是一个未初始化的指针--他从不分配任何内存来保存字符串或指针,所以它们都是悬空的。@chrisdsodd你是对的,如果它们是数组,那么类型就不会是
char**
。我为什么要使用char string[10]?我想声明字符串数组,而不是字符串。然后使用
char strings[NumberOfStrings][NumberOfCharacters]
。好的,谢谢。像您所说的那样声明字符串数组与像char**strings=?