打印时出现 C 程序错误
C program errors on print
我是 C 编程的新手,我正在编写一个基本代码,收集名字和姓氏、工作时间、小时工资,然后 return 姓氏、名字和工时*工资:
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 *
是指针吗?为什么不 return 列出第一个 char 变量,然后是第二个,在 .2 浮点 int 之前?我也在使用 nano,因此无法像往常一样进行调试。 (推荐的 IDE 也会非常有帮助。)
您已将 first_name
和 last_name
变量声明为 char
数据类型。它们应声明为 char*
并分配内存或将其声明为所需大小的 char[]
。
同时更改您的 scanf 语句以删除 &
,同时捕获用户对变量的输入,因为这些变量已经包含地址。
问题已从 scanf
开始。
通过 %s
转换,它将从输入中读取 "word";更准确地说,它将读取字符,直到它遇到一个白色 space (它被放回输入)。这些字符将从您提供的位置开始复制到内存中;最后,scanf
将添加一个空字符以终止它创建的 C 字符串。
在你的例子中,你提供了一个只包含一个字符的位置。 scanf
不知道这一点,并将继续写入超出该单个字符的内存,覆盖程序的其他数据和基础结构信息,造成灾难性后果。
正如其他人所说,您必须在内存中为名称提供更多 space。通常会声明字符数组,如 char first_name[200];
,此处包含 space 200 个字符。1
从技术上讲,first_name[200]
声明的是一个数组,而不是字符指针;但在所有常见用途中,该语言将其调整为包含数组中第一个字符地址的指针,这正是 scanf
(和 printf
)所期望的。并且他们都期望地址指向一个数组,该数组具有足够的 space(在 scanf
的情况下)分别包含一个以 null 结尾的字符序列(在 printf
的情况下) .
1 应该确保不要通过使用字段长度进行转换来读取更长的输入(并使 scanf
再次覆盖不相关的内存)。在我们的例子中,scanf("%199s", first_name);
表示我们从输入中读取最多 199 个字符,将数组中的最后一个字节保留为终止零字符,scanf
将自动添加该字符。
一个很长的名字的其余部分将保留在输入队列中并被读取为下一个字符串,从而导致错误,但以万无一失的方式处理输入错误并非易事.这是可悲的,因为初学者程序通常以人工输入为中心。 "Normal" 程序,相比之下,很少提示用户输入 — 你的 shell 和你的编辑器是明显的例外。
我是 C 编程的新手,我正在编写一个基本代码,收集名字和姓氏、工作时间、小时工资,然后 return 姓氏、名字和工时*工资:
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 *
是指针吗?为什么不 return 列出第一个 char 变量,然后是第二个,在 .2 浮点 int 之前?我也在使用 nano,因此无法像往常一样进行调试。 (推荐的 IDE 也会非常有帮助。)
您已将 first_name
和 last_name
变量声明为 char
数据类型。它们应声明为 char*
并分配内存或将其声明为所需大小的 char[]
。
同时更改您的 scanf 语句以删除 &
,同时捕获用户对变量的输入,因为这些变量已经包含地址。
问题已从 scanf
开始。
通过 %s
转换,它将从输入中读取 "word";更准确地说,它将读取字符,直到它遇到一个白色 space (它被放回输入)。这些字符将从您提供的位置开始复制到内存中;最后,scanf
将添加一个空字符以终止它创建的 C 字符串。
在你的例子中,你提供了一个只包含一个字符的位置。 scanf
不知道这一点,并将继续写入超出该单个字符的内存,覆盖程序的其他数据和基础结构信息,造成灾难性后果。
正如其他人所说,您必须在内存中为名称提供更多 space。通常会声明字符数组,如 char first_name[200];
,此处包含 space 200 个字符。1
从技术上讲,first_name[200]
声明的是一个数组,而不是字符指针;但在所有常见用途中,该语言将其调整为包含数组中第一个字符地址的指针,这正是 scanf
(和 printf
)所期望的。并且他们都期望地址指向一个数组,该数组具有足够的 space(在 scanf
的情况下)分别包含一个以 null 结尾的字符序列(在 printf
的情况下) .
1 应该确保不要通过使用字段长度进行转换来读取更长的输入(并使
scanf
再次覆盖不相关的内存)。在我们的例子中,scanf("%199s", first_name);
表示我们从输入中读取最多 199 个字符,将数组中的最后一个字节保留为终止零字符,scanf
将自动添加该字符。
一个很长的名字的其余部分将保留在输入队列中并被读取为下一个字符串,从而导致错误,但以万无一失的方式处理输入错误并非易事.这是可悲的,因为初学者程序通常以人工输入为中心。 "Normal" 程序,相比之下,很少提示用户输入 — 你的 shell 和你的编辑器是明显的例外。