【问题标题】:C: Format specifies type 'char *'C:格式指定类型'char *'
【发布时间】:2016-02-01 21:28:24
【问题描述】:

每当我运行以下代码时,我都会收到错误消息

"格式指定类型char *,但参数的类型为int。"

该程序应该打印一个 n × n 的正方形或特定字符的三角形。我对 C 语言很陌生,而且我没有太多的运气来解决这个问题。

#include <stdio.h>
#include <ctype.h>

void print_square(int n, char c) {
    for (int i=0; i < n; i++) {
        for (int j; j < n; j++) {
            printf("%c", c);
    }
        printf("\n");
}
}

void print_triangle(int n, char c) {
    int count = 1;
    for (int i=0; i < n; i++) {
        for (int j; j < count; j++) {
            printf("%c", c);
    }
        count = count + 1;
        printf("\n");
    }
}

int main(int argc, const char * argv[]) {

int n;
char cmd;
char * c;

do {

    printf("Enter T for a triangle, S for a square, "
           "Q to quit: ");
    scanf("%c", &cmd);
    cmd = toupper(cmd);

    if (cmd == 'S' || cmd == 'T') {
        printf("Enter the size: ");
        scanf("%d", &n);
        printf("Enter the character: ");
        scanf("%c", *c); // error here

        if (cmd == 'S') {
            print_square(n, *c);
        }

        else {
            print_triangle(n, *c);
        }
    }

} while (cmd != 'T' && cmd != 'S' && cmd != 'Q');

return 0;
}

【问题讨论】:

  • 我相信char *char是有区别的
  • 编译器还会输出一些其他警告:1) 未使用的参数argv[] 和未使用的参数argc。建议将 main() 的签名改为int main( void ) 2) 这一行:scanf("%c", *c);,参数多为地址指针,而不是内容。建议:scanf("%c", &amp;c); 同样c 的声明也不正确。应该是:char c; 不是 char *c;
  • 应用我之前的评论,也意味着对print_square()print_triangle()的调用应该有第二个参数c,而不是*c

标签: c pointers scanf format-specifiers


【解决方案1】:

正如你已经指出的,错误确实在

  scanf("%c", *c);

你需要传递一个有效的指针到char,为什么要取消引用?

注意:在您的情况下,您正在取消引用一个未初始化的指针,无论如何都会调用 undefined behavior

为了有一个更好的方法(你真的不需要c 成为那里的指针)做类似的事情

  char c;
  scanf(" %c", &c);  //the leading space consumes the newline in input bufer

你应该很高兴。

因此,您需要传递c 而不是*c,这与其他函数调用中的要求相同。

【讨论】:

  • @TyCharm 请注意%c 格式说明符前面的空格。这会消耗先前输入的输入缓冲区中留下的换行符和其他空格。
  • @WeatherVane 哇!!我虽然错过了。添加了注释以突出显示相同的内容。 :)
  • 差不多。对子函数print_*() 的调用需要使第二个参数为c 而不是*c`,并且声明:char *c; 需要更改为char c
猜你喜欢
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多