格式为“%c”,期望参数的类型为“ char *”,但是参数2的类型为“ char(*)[0]”

时间:2020-02-13 03:27:47

标签: c arrays

我想创建一个程序,在该程序中您将提供输入,并根据输入提供输出,但是我在输入部分遇到了一些麻烦。我首先创建了一个未初始化的字符串,并希望将输入存储在其中。但是当我编译时,它显示此错误:

格式为'%c'的参数应为'char *'类型,而参数2的类型为'char(*)[0]'

我已经上网了,但是无法获得解决方法。

到目前为止我的代码(在C中):

#include <stdio.h>
#include <stdlib.h>

int main() {
    char string[] = "";
    scanf("%c", &string);
}

3 个答案:

答案 0 :(得分:4)

&string是指向数组的指针,仅传递string就足够了。 string的长度为1,可以容纳单个字符,但是请勿尝试将其解释为字符串,因为它不会以空字符结尾。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char string[] = "";
    scanf("%c", string);
}

或者,您可以执行此操作。它是等效的,有人说它更具可读性。

int main() {
    char string[] = "";
    scanf("%c", &string[0]);
}

答案 1 :(得分:0)

您的问题陈述是“我想创建一个程序,您可以在其中输入内容,并根据输入内容给出输出结果”

您可以尝试以下操作:

#include <stdio.h>
#include <stdlib.h>

#define MAX_LEN 50

int main(){
    char string[MAX_LEN+1];

    //fgets is safe & would read whitespaces
    fgets(string, MAX_LEN, stdin);
    printf("%s", string);
    return 0;
}

答案 2 :(得分:-1)

关于;

scanf("%c", &string);

变量string是一个数组。在C语言中,对数组的“裸”引用会降级为数组第一个字节的地址。因此,对scanf()参数&string的调用要求一个地址的地址。

通常,编译器将输出警告(如您所见),但会生成正确的代码。为避免此问题,当参数是对数组的“裸”引用时,请从参数中删除&。 I.E。

scanf("%c", string);

更好,请使用:

scanf("%c", &string[0]);

对于健壮的代码,请始终检查任何scanf()函数家族中的返回值。通常,它们返回成功的输入格式转换说明符的数量。所以一个更好的例子是

if( scanf("%c", &string[0]) != 1 )
{
    fprintf( stderr, "scanf for first char of array -string- failed" );
}

这种错误(通常)不可恢复,因此通常的代码是:

if( scanf("%c", &string[0]) != 1 )
{
    fprintf( stderr, "scanf for first char of array -string- failed" );
    exit( EXIT_FAILURE );
}

exit()和EXIT_FAILURE都在头文件stdlib.h

中公开