【问题标题】:C program errors on print打印时出现 C 程序错误
【发布时间】:2019-09-18 11:40:39
【问题描述】:

我对 C 编程非常陌生,我正在编写一个基本代码,它收集名字和姓氏、工作时间、小时工资,然后返回姓氏、名字和小时 * 工资:

    char first_name;
    char last_name;

    printf("\n%s, %s: %.2lf\n", last_name, first_name, total_payment);

我在编译时收到的错误是:

payroll.c:22:13: warning: format '%s' expects argument of type char *' but argument 2 has type 'int' [-Wformat=]
printf("\n%s, %s: %.2lf\n", last_name, first_name, total_payment);
          ^

payroll.c:22:13: warning: format '%s' expects argument of type char *' but argument 3 has type 'int' [-Wformat=]
printf("\n%s, %s: %.2lf\n", last_name, first_name, total_payment);
              ^

我不明白这个错误。 char * 是指针吗?为什么它不返回列出的第一个 char 变量,然后返回 .2 浮点 int 之前的第二个?我也在使用 nano,因此无法像往常一样进行调试。 (推荐的 IDE 也会非常有帮助。)

【问题讨论】:

  • first_namelast_name单个字符。它们不能保存以 null 结尾的字节字符串。看来您可能需要退后一步来阅读您的书或教程。
  • %s 用于字符串。你传递一个字符。单个字符不是字符串。字符串有一个零字符作为终止符。
  • 免费的 Visual Studio 版本非常适合调试,如果您在 Windows 上,imo 通常是一个令人愉快的 IDE。也许有人推荐适用于 Linux 和 Mac 的 IDE?
  • 在阅读和考虑编译器警告方面得到了我的意见。这甚至超过了许多有经验的程序员可以做到的。
  • 谢谢大家。我来自 Java,所以这在某些方面非常陌生。我感谢您的帮助,并确实通过建议和我的资源解决了问题。 (通常我需要几个小时或几天,但这是即时的。)

标签: c console-application


【解决方案1】:

您已将 first_namelast_name 变量声明为 char 数据类型。它们应声明为char* 并分配内存或将其声明为所需大小的char[]

同时更改您的 scanf 语句以删除 &,同时将用户输入捕获到变量,因为这些变量已经保存了地址。

【讨论】:

  • 这还不够,除非 OP 让它们指向有效的地方(你没有描述如何做)。考虑到 OP 的混乱,这甚至可能是非常糟糕的建议。
  • 这已经足够了,加上我的资源,解决了这个问题。感谢您抽出宝贵时间。这实际上是我的第一个程序,我刚刚开始了解 malloc,这很难。非常感谢。
【解决方案2】:

问题已经从scanf开始。

通过%s 转换,它将从输入中读取一个“单词”;更准确地说,它会读取字符,直到遇到空格(将其放回输入中)。这些字符从您提供的位置开始复制到内存中;最后,scanf 将添加一个空字符以终止它创建的 C 字符串。

在您的情况下,您提供了一个仅包含一个字符的位置。 scanf 不知道这一点,并将继续写入超出该单个字符的内存,覆盖程序的其他数据和基础设施信息,造成灾难性后果。

正如其他人所说,您必须为名称提供更多的内存空间。通常会声明字符数组,例如 char first_name[200];,此处包含 200 个字符的空间。1

从技术上讲,first_name[200] 声明了一个数组,而不是字符指针;但在所有常见用途中,该语言将其调整为包含数组中第一个字符的地址的指针,这正是scanf(和printf)所期望的。并且他们都期望地址指向一个有足够空间的数组(在scanf的情况下)分别包含一个以null结尾的字符序列(在printf的情况下)。


1 应确保不要通过使用字段长度进行转换来读取更长的输入(并使scanf 再次覆盖无关的内存)。在我们的例子中,scanf("%199s", first_name); 表示我们从输入中读取最多 199 个字符,将数组中的最后一个字节留给 scanf 将静默添加的终止零字符。

一个很长的名字的其余部分会留在输入队列中并作为下一个字符串被读取,从而导致错误,但是以一种万无一失的方式处理输入错误并非易事。这很可悲,因为初学者程序通常以人工输入为中心。相比之下,“普通”程序很少提示用户输入——除了你的 shell 和你的编辑器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多