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 指针是未定义的行为,您必须小心不要导致未定义的行为,因为它太难调试了。