C:格式%s期望有趣字符串程序中char *类型的参数

时间:2015-06-04 01:16:04

标签: c string scanf

我正在制作一个程序来检查有趣的字符串。要理解练习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 **?

我将不胜感激任何帮助或提示。

谢谢!

1 个答案:

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