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() 中的对称性。我观察到&lt;inttypes.h&gt; 中的宏并不直接适用。 SCNu8PRIu8 等宏适用于uint8_t,而不适用于uint8。也就是说,它们可能会被使用并且它们可能会正常工作——假设它们在 &lt;inttypes.h&gt; 中提供:

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 &lt; 0 的测试毫无意义,因为g_temp 是无符号类型,永远不会是负数。如果被问到,GCC 会指出这一点。您通常应该将增量放在 for-control 行中:for (gr_c = 0; gr_c &lt; 3; gr_c++),而不是将空增量放在顶部并将增量放在循环的尾部。请注意,后缀_t 通常表示一个类型(例如&lt;stdint.h&gt; 中的uint8_t),而不是变量,并且应将后缀视为保留。 (见What does a type followed by _t (underscore-t) represent?)。

以上是关于C中带有scanf和printf的uint8的主要内容,如果未能解决你的问题,请参考以下文章

scanf中带除格式符外的字符

C语言的printf有多少个格式码?

c语言中,puts和printf函数有啥区别?

C语言中printf输出float和double都用%f么(scanf又如何)

C语言05-printf和scanf函数

stm32CubeMx上移植自己的printf()和scanf()函数