首页
学习
活动
专区
工具
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

86810
  • 第五节(信息读写基础)

    例如,如果要打印一个有符号十进制整型(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()语句,可以获取一个字符、一个符号十进制整型数和另一个字符

    19620

    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

    13210

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

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

    48220

    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”。

    1K40

    格式化输入输出

    以下是一些常用格式控制符: %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类似 %%:输出百分号字符 此外

    24210

    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.2K20

    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.8K90

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

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

    68110

    详解CC++输入输出

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

    14210

    初识C语言·2

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

    7510

    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 函数来接收字符

    4.7K50

    C语言中‘0’和EOF区别

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

    28210

    【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,除了它以外,所有的占位符都会自动忽略起首空白字符,它总是会返回它所遇到第一个字符

    8710

    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.8K00

    【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函数报错方法

    9610

    C与C++最常用输入输出方式对比

    函数第一个参数 format 为包含占位符C字符串,随后参数为占位符对应类型变量地址,通常与取地址符&结合使用。...2 //正确输出后返回值为:26(汉字与中文符号占2个,'\n'占1个) return 0; } ---- 1.3 占位符 占位符是一种有特定作用符号,用于在格式化字符串中占住一个固定位置...对应数据类型 d 以十进制形式输出整数 int lld 以十进制形式输出长整数 long long o 以八进制形式输出符号整数(不输出前缀0) int x 以十六进制形式输出符号整数(不输出前缀...0x) int u 以十进制形式输出符号整数 unsigned int llu 以十进制形式输出符号长整数 unsigned long long int f 以小数形式输出单、双精度实数 float...+ 输出符号(正号或负号)。 空格 输出值为正时冠以空格,为负时冠以负号。 # 输出非十进制数时冠以前缀(00x);输出浮点数时在小数部分为0时省略小数点。

    84320

    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

    printf 和scanf 介绍-学习笔记

    • %u:符号整数(unsigned int)。 • %x:十六进制整数。 • %zd: size_t类型。 • %%:输出一个百分号。...d%f",&x,&y); return 0; } 2.2 scanf返回值 scanf() 返回值是一个整数,表示成功读取变量个数。...作用:通常会使用scanf返回值,来判断是否读取正确 在OJ刷题时候,多组数据输入情况下,经常会用到。...另外,scanf() 遇到 %s 占位符,会在字符变量末尾存储一个空字符 \0scanf() 将字符串读入字符数组时,不会检测字符串是否超过了数组长度。...& return 0; } 上面示例中, name 是一个长度为11字符数组,scanf()占位符 %10s 表示最多读取用户输入10 个字符,后面的字符将被丢弃,这样就不会有数组溢出风险了

    13810
    领券