C中带有scanf和printf的uint8
Posted
技术标签:
【中文标题】C中带有scanf和printf的uint8【英文标题】:uint8 with scanf and printf in C 【发布时间】:2017-01-07 22:38:48 【问题描述】:这个代码单元是一个更大的 C 数据库代码的一部分。这部分需要学生的成绩。要求是使用 typedef unsigned char uint8 而不是简单的 int。 为了我的生活,我无法让它工作。当我在 scanf 中使用 %c 时,它会跳过。如果它有时会打印第一个数字,则在打印中。所以这是带有 int 的代码,它工作正常,我如何使它与 uint8 或 unsigned char 一起工作???
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <inttypes.h>
#include <string.h>
//typedef unsigned char uint8;
typedef unsigned int uint8;
int main(void)
uint8 grades_t[3], gr_c, g_temp;
for (gr_c = 0; gr_c < 3;)
printf("please enter the grade (0-100) of subject no%d: ", gr_c+1);
scanf("%d", &g_temp);
if (g_temp < 0 || g_temp > 100) //only accept values between 0-100
printf("please enter valid grade from 0 - 100!\n");
gr_c --; //if value is out of range, decrement
else //store value
grades_t[gr_c] = g_temp;
gr_c++;
printf("grade = %d\n", grades_t[0]); //unite test
printf("grade = %d\n", grades_t[1]);
printf("grade = %d", grades_t[2]);
return 0;
【问题讨论】:
欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请查看About 页面以及How do I ask questions here? 和What do I do when someone answers my question? 【参考方案1】:您希望将unsigned char
视为一个小整数,而不是一个字符。假设 C99 或更高版本,您将使用:
unsigned char u1; // Or, given typedef unsigned char uint8; uint8 u1;
if (scanf("%hhu", &u1) != 1)
…oops…
printf("Value: %d\n", u1);
scanf()
转换中的hh
指定提供的指针指向(无符号)char
。无需对printf()
进行相应更改,因为u1
将自动升级为int
。但是,如果您愿意,您可以使用:
printf("Value: %hhu\n", u1);
这保留了printf()
和scanf()
中的对称性。我观察到<inttypes.h>
中的宏并不直接适用。 SCNu8
和PRIu8
等宏适用于uint8_t
,而不适用于uint8
。也就是说,它们可能会被使用并且它们可能会正常工作——假设它们在 <inttypes.h>
中提供:
if (scanf("%" SCNu8, &u1) != 1)
…oops…
printf("Value: %" PRIu8 "\n", u1);
【讨论】:
我相对较新,所以.. 我使用 Code::Blocks v16.01 并且从我可以看到它使用 GNU GCC。 %hhu 也给出了错误,所以我假设它。我可以更改一些内容以使其使用 C99 或 C11。如果你愿意,你能给我一个关于如何使用 SCNu8 和 PRIu8 的参考 您是在基于 Unix 的系统(Linux、Mac、BSD 等)还是在 Windows 上运行 CodeBlocks?如果我怀疑您使用的是 Windows,那么问题在于运行时库是否支持hh
表示法。你可能比我运气好(谷歌刚刚决定为我提供俄语页面),但scanf()
width specification 可能会有所帮助——文本主要是英文;它没有列出hh
,这并不奇怪,因为 MS 运行时并不完全符合 C99。
女士,不幸的是。我可以使用 SCNu8 和 PRIu8 吗?如果是这样,如何?提前致谢。
g_temp < 0
的测试毫无意义,因为g_temp
是无符号类型,永远不会是负数。如果被问到,GCC 会指出这一点。您通常应该将增量放在 for-control 行中:for (gr_c = 0; gr_c < 3; gr_c++)
,而不是将空增量放在顶部并将增量放在循环的尾部。请注意,后缀_t
通常表示一个类型(例如<stdint.h>
中的uint8_t
),而不是变量,并且应将后缀视为保留。 (见What does a type followed by _t
(underscore-t) represent?)。以上是关于C中带有scanf和printf的uint8的主要内容,如果未能解决你的问题,请参考以下文章