首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么scanf会用0覆盖以前读取的无符号字符变量?

scanf函数是C语言中用于从标准输入流中读取数据的函数。它根据指定的格式字符串,将输入的数据按照指定的格式进行解析并存储到相应的变量中。

在C语言中,scanf函数的返回值表示成功读取并解析的参数个数。当scanf函数读取一个无符号字符变量时,如果输入的字符无法解析为无符号字符,scanf函数会返回0,表示解析失败。

当scanf函数解析失败时,它会停止解析并将解析失败的字符留在输入缓冲区中。下一次调用scanf函数时,如果格式字符串中包含了对无符号字符变量的读取,scanf函数会尝试继续解析输入缓冲区中的字符。

如果输入缓冲区中的字符无法解析为无符号字符,scanf函数会将无符号字符变量的值保持不变,即不会修改它的值。这就是为什么scanf会用0覆盖以前读取的无符号字符变量的原因。

需要注意的是,scanf函数对于解析失败的字符并不会进行清除操作,因此在使用scanf函数读取无符号字符变量之前,应该先清除输入缓冲区中的无效字符,以免影响后续的输入操作。

总结起来,scanf函数会用0覆盖以前读取的无符号字符变量是因为解析失败时,scanf函数会返回0,并且不会修改无符号字符变量的值。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c语言之输入和输出

2、%u 十进制无符号整数。 3、%ld 输出long整数 。 4、%s 字符串。 5、%c 单个字符。 6、%p 指针的值。 7、%e 指数形式的浮点数。...8、%x, %X 无符号以十六进制表示的整数。 9、%0 无符号以八进制表示的整数。 10、%g 自动选择合适的表示法。 为什么需要控制符?...以上代码如果用scanf_s,第二行应改为scanf_s("%s",buf,5),表示最多读取5个字符,因为buf[5]要放'\0'scanf_s最后一个参数是缓冲区的大小,表示最多读取n-1个字符。...vc++2005/2008中提供了scanf_s(),在最新的VS2015中也提供了scanf_s()。在调用时,必须提供一个数字以表明最多读取多少位字符。...我们可以继续为接下去的变量赋值。 可以丢弃上一个scanf_s输入不正确的值。 ?

3.6K10

scanf的正则表达式总结

scanf作为C语言的格式化输入函数,定义于stdio.h中,本文总结一下scanf与正则表达式相关的地方。(注意:假设输入中无空格,空格将做特殊说明)。...4252772是x未初始化的值,因为x并没有匹配到输入。 匹配的集合操作 [a-z0-9] 表示匹配a到z中任意字符,以及1到9的任意字符。 [zJ3.] 匹配'a','J','3','.'...&x); //这里注意的是[^a]后的a,思考一下为什么这后面要带个a。...%符号总结 %后跟着读取的符号,除了*外,顺序对应后面的变量(准确的说是变量地址),通常的%s,%d就不说了,很常用。 %4s,表示匹配长度为4的字符串,%4d等类同。...//网上的一个题目 //从中取出tom scanf("%*[^:]:%[^@]",str); //分析:首先,%*[^:]忽略掉开头字符串,直到:,然后读取tom

92310
  • printf和scanf的介绍以及VS解决scanf报错问题

    %s:字符串。%u:无符号整数(unsigned int)。%x:十六进制整数。%zd:size_t类型。%%:输出一个百分号。...size_t是sizeof()的返回类型,size_t是无符号的整型类型。1.2scanf中占位符的介绍scanf和printf的占位符基本一样。...return 0;}%s不会包含空白字符,无法读取多个字符,除非多个%s一起使用。scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。...return 0;}3.scanf的介绍printf —— 输出,scanf ——输入& —— 取地址符号,如果变量是指针变量,就不用加&运算符。...scanf返回值:①scanf返回值是一个整数,表示成功读取的变量个数。②如果没有读取任何项,或者匹配失败,则返回0。

    9210

    第五节(信息读写基础)

    例如,如果要打印一个有符号十进制整型(int 和long类型)变量,就要使用%d转换说明; 对于无符号十进制整型(unsigned int 和unsigned long )变量,要使用%u转换说明; 对于浮点型...char    数组 %u 无符号十进制整型 unsigned  int  、  unsigned  short %1u 无符号十进制长整型 unsigned   long 注意: 使用printf...scanf()函数以指定的格式从键盘读取数据,并将输入的数据赋值给程序中的一个或多个变量。 printf() 和scanf() 都使用格式字符串描述输入的格式。...scanf()函数的格式字符串使用的转换说明与printf()函数的相同。 例如  语句: scanf("%d", &x) ; 读取用户从键盘输入的一个十进制整型数,并将其赋值给整型变量x。...printf( "\n" ); puts( "" ); 以上表示puts()会自动添加换行符而printf()不会 2.编写一条scanf()语句,可以获取一个字符、一个无符号十进制整型数和另一个字符

    20520

    重温C语言,这三十多个细节你把握住了?

    :2颗星 / 重要指数:3颗星 scanf读取字符串 常用ascii码 难度指数:1颗星 / 细节指数:3颗星 / 重要指数:4颗星 浮点数的比较大小 难度指数:1颗星 / 细节指数:2颗星 / 重要指数...像我以前用TXT编程的时候,这个问题就只能靠自己去挖掘了。 细节之处见真章。...---- 标准输入输出中的占位符 难度指数:2颗星 / 细节指数:2颗星 / 重要指数:3颗星 %d —— 以带符号的十进制形式输出整数 %o —— 以无符号的八进制形式输出整数 %x —— 以无符号的十六进制形式输出整数...%u —— 以无符号的十进制形式输出整数 %c —— 以字符形式输出单个字符 %s —— 输出字符串 %f —— 以小数点形式输出单、双精度实数 %e —— 以标准指数形式输出单、双精度实数 %g —...---- scanf读取字符串 和读取单个字符不同,读取字符串的时候,是不需要加上&符号的。

    48520

    C语言——B数据类型和变量

    char 类型是用来表示字符的,通常是一个 8 位的整数类型。如果 char 是有符号的,那么其取值范围通常是 -128 到 127。如果 char 是无符号的,那么其取值范围通常是 0 到 255。...例如,C 和 C++ 中的 char 类型通常是有符号的,所以其取值范围是 -128 到 127。而在很多其他语言中,比如 Java,char 类型是无符号的,所以其取值范围是 0 到 255。...四、变量 1、变量的创建 为什么要清楚类型:因为要使用类型来创建变量。 什么是变量(是什么):在内存中开辟特定大小的空间,用来保存数据。...2、返回值 scanf ( ) 的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。...这也意味着,scanf() 不适合读取可能包含空格的字符串,比如书名或歌曲名。另外, scanf() 遇到 %s 占位符,会在字符串变量末尾存储⼀个空字符 \0 。

    16610

    【C语言指南】scanf()函数详解

    例如下面这种情况 读取两个字符存入char a和char b,但是在scanf()函数的两个格式说明符之间写了一个非空字符b,这样就会导致从键盘输入两个字符存入变量时,中间必须输入一个b,b被读取之后会被丢弃...u 读入无符号符号十进制整数。输入格式应该像strtol函数的base实参为10调用时识别的字符序列一样。 i 读入可选有符号整数。...为了防⽌这种情况,使⽤ %s 占位符时,应该指定 读⼊字符串的最长长度 第三、scanf() 遇到 %s 占位 符,会在字符串变量末尾存储⼀个空字符 \0。...t与d, i, o, u, x, X, or n配合使用,表示对应一个ptrdiff_t数据(或与ptrdiff_t对应的无符号整型数据)。...赋给变量b,因为到#已经不是浮点型的有效字符;第三个说明符是字符型,读取一个# 此时scanf()函数已经读取完成,剩下的字符会停留在缓存中 #include int main()

    41510

    格式化输入输出

    以下是一些常用的格式控制符: %d:读取有符号整数 %ld:读取有符号长整数 %u:读取无符号整数 %lu:读取无符号长整数 %f:读取单精度浮点数 %lf:读取双精度浮点数。...%c:读取字符 %s:读取字符串 %x:读取十六进制(小写字母)整数 %X:读取十六进制(大写字母)整数 %o:以八进制形式读取无符号整数 %e:以指数形式读取单、双精度实数 %p:读取一个指针的地址,...scanf输入数据的存放时,一定是存放在一个对应数据类型的内存空间,所以体现在scanf的函数传参就是带&符合的地址。如果传入的是变量,而不是它的地址,可能会产生不可预知的错误。...%d:输出有符号整数 %ld:输出有符号长整数 %u:输出无符号整数 %lu:输出无符号长整数 %f:以小数形式输出单精度、双精度浮点数 %c:输出单个字符 %s:输出一个字符串 %x:输出十六进制(小写字母...)整数 %X:输出十六进制(大写字母)整数 %o:以八进制形式输出无符号整数(不输出前缀0) %e:以指数形式输出单、双精度实数 %p:输出一个指针的地址,与%x和%lx类似 %%:输出百分号字符 此外

    26910

    scanf的使用,cin和scanf的区别

    ); 100,100 u unsigned int 以无符号整型输出 printf( “%u,%u”,100u,100); 100,100 o unsigned int 以八进制无符号整S输出 printf...0 参数的前面用0填充,直到占满指定列宽为止(如果同时存在“-”,将被“-”覆盖,导致 0 被忽略 3) 宽度(width) 它用于控制显示数值的宽度,如表 3 所示。...表 4 精度及其说明 符号 说 明 无 系统默认精度 .0 对于 d、i、o、u、x、X等整形类型符,采用系统默认精度;对于f、F、e、E等浮点类型符,不输出小数部分 .n 1) 对于d、i、o...hello”字符串的,但为什么输入到“l”就结束了呢?...同理,第 3 个 scanf 读取了“e”,第 4 个 scanf 读取了第 2 个回车符“\n”,第 5 个 scanf读取了“l”。

    1.1K40

    C语言printf()scanf()的转换说明和转换说明修饰符

    int 无符号8进制(octal)整数(不输出前缀0) printf("0%o",123);输出0173 u unsigned int 无符号10进制整数 printf("%u",123);输出123...使用scanf()有一下两个规则: 如果用scanf()读取基本变量类型的值, 在变量名前加上一个&; 如果用scanf()把字符串读入字符串数组中, 不要使用&....原因:要在流中做格式转换,再将结果放到内存变量中 补充:(详见CPrimerPlus P95) 如果使用%s转换说明,scanf()会读取除空白字符外的所有字符。...scanf()跳过空白字符开始读取第一个非空白字符,并保存非空白字符直到遇到下以恶搞空白字符,这意味这%s转换说明只能读取不包含空白地府的字符串,scanf会在字符序列的末尾加上\0,让数组中的内容形成一个字符串...需要使用复制操作将返回值存储在变量中。和scanf 函数一样,getchar 函数也不会在读取时跳过空白字符。putchar 函数用来写单独的一个字符,如putchar(ch)。

    2.3K20

    C语言中的基本输入输出

    其一般调用形式为: getchar(); getchar会以返回值的形式返回接收到的字符.通常的用法如下: char c; /*定义字符变量c*/ c=getchar(); /*将读取的字符赋值给字符变量...常用的输出格式及含义如下: 格式字符 d , i 以十进制形式输出有符号整数(正数不输出符号) O 以八进制形式输出无符号整数(不输出前缀0) x 以十六进制形式输出无符号整数(不输出前缀0x) U...以十进制形式输出无符号整数 f 以小数形式输出单、双精度类型实数 e 以指数形式输出单、双精度实数 g 以%f或%e中较短输出宽度的一种格式输出单、双精度实数 C 输出单个字符 S 输出字符串 关于...,并且包含直到下一个空白字符的全部字符 %u 把输入解释成一个无符号十进制整数 %x,%X 把输入解释称一个有符号十六进制整数 *修饰符在scanf中()的用法: *在scanf()中提供截然不同的服务...如果它没有读取任何项目(比如它期望接收一个数字而您却输入的一个非数字字符时就会发生这种情况),scanf()返回0。

    3.9K90

    详解CC++输入输出

    cin是自动判断你的变量类型,比如char类型,他会用默认的char方法(%c)取数据。这就会影响的效率。 scanf遇到空格、Tab、回车都会结束输入。...三、gets gets() 函数的功能是从输入缓冲区中读取一行字符串存储到字符指针变量 str 所指向的内存空间。可以接受空格、Tab,但是不接受回车。...它的基本语法如下: cin.get(character); 其中,character为一个字符变量,用于存储从输入流中读取的字符。...cin.get函数会读取输入流中的下一个字符,无论该字符是空格、制表符还是换行符。读取成功后,该字符会被存储到character变量中。它可以接受空格,不接受回车,回车结束输入。...%s:输出一个字符串。 %c:输出一个字符。 %p:输出一个指针地址。 %x:输出一个无符号十六进制整数。

    24110

    初识C语言·2

    inunsigned int类型比int类型的容量大是因为,unsigned int是无符号类型的,所以最高位不表示正负,而int类型的最高位是表示正负的。...sizeof 运算符的返回值,C 语⾔只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定, sizeof 到底返回什么类型。...它的其他参数就是存放用户输入的变量,有多少个占位符就有多少个变量。 注意:变量前面必须加&(指针变量除外),这个符号是取地址符号,因为scanf传递的是地址,而不是值,即变量的地址指向用户输入的值。...当然,scanf也可以像printf一样,拥有多个占位符。 2 scanf的返回值 scanf()的返回值是一个整数,表示成功读取变量的个数,如果没有读取到任何项,或者匹配失败,就会返回0。...即%s不会包含空白字符,所以无法用来读取多个单词,另外,scanf()遇到%s会在字符串变量末尾存储字符0。 scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组长度。

    8510

    『C语言』getchar() & putchar() 〖input & output〗

    ↓ 代码示例 第①种字符型变量 第②种整形变量 第③种常量 第④种转义字符 返回值 putchar()练习题 第①种形式 第②种形式 getchar() → 字符数据输入  无参 返回值 返回类型 注意...putchar() → 字符数据输出 输出字符数据是可以使用 putchar() 函数的,其作用是向显示设备进行输出①个无符号字符。 注意:是①个字符,当然也可以说是单个字符咯。...---- getchar() → 字符数据输入  字符数据输入当中是可以使用getchar()函数,作用是向显示设备进行输入①个无符号字符。 注意:是①个字符,当然也可以说是单个字符咯。...返回类型 相信有细心的小伙伴已经发现了一个问题明明在这里输入的是字符型类型为什么最终的返回值是整形(int)类型而不是字符(char)呢?...第②种输入字符直到输入回车 代码示例如下↓ while (getchar() != '\n') 通过上面我们知道getchar()作用是向显示设备进行输入①个无符号字符。

    69710

    c语言getchar()的用法_c=getchar()

    ---- 二、函数返回值 该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读取错误,则返回 EOF(-1)。...当按下 ctrl + z 时程序结束运行 这是为什么呢,程序的运行过程是这样的,getchar 有一个 int 型的返回值。...参考文章:getchar的使用 ---- 三、注意区分 getchar 和 scanf 对于 scanf 函数,'\n' 会触发 scanf 读取输入缓冲区的内容,但遇到 '\n' 或空格 ' ' 会停止读取...\n"); } return 0; } 运行结果: 输入密码 123456 之后,程序没有让我们确认密码,直接判断确认失败了,为什么会出现这样的结果呢?...,遇到 ‘\n’ 结束读取,这时运行到后面的 getchar 函数了,getchar 发现缓冲区里还有一个 ‘\n’ ,直接将其读取走并会返回给整型变量 ch,这时没有多余的 getchar 函数来接收字符

    7.5K50

    C语言中‘0’和EOF的区别

    字符串的定义 在C语言中没有严格的标准定义字符串,即在C语言中没有字符串这一变量类型。 C语言中字符串的存储通常是以字符数组的形式来进行的。 以字符串“hello world !”...为例,其存储方式如下图所示: 可以看到字符串就是开辟了一串连续的字符变量内存,按照一定的顺序进行存储,并且在字符串的末尾加上空字符’\0’‘’。...代码如下所示: #include #include //strlen的函数返回值类型是unsigned int类型(无符号数),打印无符号数用%zd; unsigned...这里我们先了解一下scanf()这个函数: sacnf函数 scanf()读取匹配format(格式)字符串的输入. 当读取到一个控制字符, 它把值放置到下一个变量....空白(tabs, 空格等等)会跳过 scanf()的返回值是成功赋值的变量数量, 发生错误时返回EOF.

    33110

    【C语言】C语言零基础纯干货教学(上)

    n", "Hello World\n"); printf("Hello World"); return 0; } 字符的末尾放着一个不可见的 ‘/0’,它是一个转义字符,这个符号是字符读取结束符,遇到它字符串的读取就结束了...signed是有符号的 unsigned是无符号的 (1)字符型char char [signed] char unsigned char (2)整形int //短整型 short [int...,根据表达式的类型得出大小 返回值是size_t类型的,是无符号整形,但其为无符号长整型还是无符号长长整形还是无符号整形由编译器决定 (2)数据类型长度 #include int...("%d%d%f%f", &a, &b, &c, &d); 空格,回车等键被认为是结束某一值的输入 比如说输入1后空格,第一个值a就是1 ②scanf的返回值 scanf的返回值是一个整数,表示成功读取的变量个数...,没有读取或者匹配失败返回0,读取数据前发生了错误或读到文件结尾返回EOF ③占位符 与printf相同,不过有几个注意事项: 对于%c,除了它以外,所有的占位符都会自动忽略起首的空白字符,它总是会返回它所遇到的第一个字符

    10110

    Golang fmt Printf 格式化参数手册详解说明

    以下例子中用到的类型或变量定义: type Website struct { Name string } // 定义结构体变量 var site = Website{Name:"studygolang...以产生更紧凑的(无末尾的0)输出 Printf("%G", 10.20+2i) (10.2+2i) 字符串与字节切片 占位符...若整数为无符号类型,他们就会被打印成无符号的。类似地,这里也不需要指定操作数的大小(int8,int64)。 宽度与精度的控制格式以Unicode码点为单位。...Scan、Scanf 和 Scanln 从 os.Stdin 中读取;Fscan、Fscanf 和 Fscanln 从指定的 io.Reader 中读取; Sscan、Sscanf 和 Sscanln...若提供给 Fscan 的读取器实现了 ReadRune,就会用该方法读取字符。若此读取器还实现了 UnreadRune 方法,就会用该方法保存字符,而连续的调用将不会丢失数据。

    3.3K10

    Linux系统下C++标准库函数

    包含 数据转换 随机数 字符集的转换  1)字符串转换成对应的数  函数名作用 atof()将字符串转换成浮点型数 atoi()将字符串转换成整型数 以前i=16位 l=32位...atol()将字符串转换成长整型数 现在i=32位 l=64位atoll()将字符串转换成长整型数 ll=64位 部分系统不支持使用strtol()将字符串转换成整数strtoul( )将字符串转换成无符号整数...strtoll( )将字符串转换成长整数(C++11标准及以上)strtoull()将字符串转换成无符号长整数(C++11标准及以上)strtof()将字符串转换成浮点数(C++11标准及以上)strtod...多个变量拼接到一个字符串中snprintf()格式化字符串复制 多个变量拼接到一个字符串中 多了字符串大小参数fprintf()格式化输出数据至文件 用文件记录数据 可以不受缓冲区影响 数据量大时读取速度慢...vfprintf()格式化输出数据至文件 4、格式化输入函数  函数名作用scanf()格式化字符串输入 可用一个变量记录scanf()的返回值 1、空格是默认的分隔符 2、部分数据格式是可以自动正确分割的

    1.9K00

    【C生万物】C语言数据类型、变量和运算符

    C语言提供的一下数据类型: 1.1 字符型 // 注:带[]的可以省略 char [signed] char // 有符号的char unsigend char // 无符号的char 1.2...,整数部分超过6位,转为科学计数法,指数部分的 e 小写 %G 等同于 %g,唯一区别是指数部分的 E 为大写 %i 有符号十进制整数 %o 无符号八进制整数 %p 指针 %s 字符串 %u 无符号十进制整数...%x 无符号十六进制整数,使用十六进制数 0 f %X 无符号十六进制整数,使用十六进制数 0 F %% 打印一个百分号 10.1.3 输出格式 printf(格式字符串,待打印项1,待打印项2,....scanf() 处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等 10.2.2 scanf()的返回值 scanf() 的返回值是一个整数,表达式成功读取的变量个数。...注意: 如果用scanf() 读取基本变量类型的值,在变量名前加上一个& 如果用scanf() 把字符读入字符数组中,不要使用& 解决VS编译器scanf函数报错的方法

    12410
    领券