关于char a,b,c,%d,%c%d分两次用scanf函数输入,却清零了第一次的数值问题

问题描述

关于char a,b,c,%d,%c%d分两次用scanf函数输入,却清零了第一次的数值问题

#include
#include
main()
{
unsigned char a,b,c;

scanf("%d",&a);
printf("%dn",a);
getchar();
printf("%dn",a);
scanf("%c %d",&b,&c);

printf("%d,%c,%dn",a,b,c);
}
这里使用了两次scanf,第一次输出两次a的值,都没有问题,到第二次scanf之后,a的值就发生了改变,实验过在同一行并不会发生问题,请问,为什么使用两次scanf,第二次会把第一次scanf()输入的数值清零?

解决方案

因为abc都是char,而你用了%d,而scanf不会对类型做检查,因此它冲掉了c之后的那个变量,因为堆栈是倒过来的,而a在前面,就冲掉了。

解决方案二:

你用%d输入就把c之后的变量覆盖了

解决方案三:

说句题外话,话说char类型为何还要用unsigned?

时间: 2024-10-01 03:14:29

关于char a,b,c,%d,%c%d分两次用scanf函数输入,却清零了第一次的数值问题的相关文章

C语言学习教程第四章-数组(5)

用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'.上面的数组c在内存中的实际存放情况为: C program\0`\0'是由C编译系统自动加上的.由于采用了`\0'标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理.在采用字符串方式后,字符数组的输入输出将变得简单方便. 除了上述用字符串赋初值的办法外,还可用printf函数和scanf函数一次性输出输入一个字符数组中的字符串, 而不必使用循环语句逐个地输入输出每个字符.void main(){

让你提前认识软件开发(16):如何对程序进行优化?

第1部分 重新认识C语言 如何对程序进行优化?            对程序进行优化,是软件开发工程师必然会涉及到的问题.那么为什么要对程序进行优化呢?原因有以下几个:         第一,在原程序基础之上新增.删除或修改了功能,需要改变原程序流程.客户需求随时可能会变化,今天已经实现的功能,说不定明天就要修改或去掉.落实到程序上面,就需要我们随时准备对写好的代码进行修改,而不要奢望写好之后就永远不要动了.         第二,原程序有bug.这类情况出现得非常的频繁,很多软件有1.0.2.

基于51单片机红外线远程控制密码锁

代码.仿真图.PCB图,论文下载地址:红外线远程控制密码锁 /*本源码是网络人VS灰鸽子的一个朋友所写,在这里分享出来希望能够给大家有一定引导性的作用,不要直接复制,这样对你的学习是没有帮助的,希望大家还是坚持把代码看*下来,这样我相信你会学到更多 */ #include <reg51.h> #include<intrins.h> #define LCM_Data  P0 #define uchar unsigned char  #define uint  unsigned int

ZED-Board从入门到精通系列例程——全局定时器

本文系ZED-Board从入门到精通(三):从传统ARM开发到PS开发的转变之后增加的PS例程.由于原文较长,在原帖后面添加例程会使阅读不便,于是单独开一帖.   实际项目中几乎离不开时间的测量.定时器是硬件系统运行状态的忠实记录者,它不受CPU直接干预,自己独立运行,可以完成计时.定时.中断.实时时钟等功能.   ARM Cortex-A9内部有一个64bit全局定时器,特性包括: 64bit,增计数: 内存映射至私有内存空间: 只有复位后,在安全模式下才能访问: 可被所有Cortex-A9核

malloc,colloc,realloc内存分配,动态库,静态库的生成与调用

 1.在main方法里面直接定义一个非常大的数组的时候,可能会出现栈溢出:错误代码演示: #include<stdio.h> #include<stdlib.h> void main() {     int a[1024 * 1024];     int num = 100;     system("pause"); } 错误截图: 2.在定义数组的时候要定义数组的长度,否则会出现错误.(特例:在GCC编译器下,不会出现错误(因为标准不一样)). 3.打印并

C语言Scanf函数

C语言的scanf函数 一.变量的内存分析 (一)字节与地址 ①. 内存以字节为单位 每个字节都有自己的内存地址,根据地址就可以找到该字节.整个内存相当于一整个酒店,而酒店以房间为单位,在这里每个房间就相当于是每个字节,地址就是房号,根据房号可以找到房间(根据地址也可以找到内存中的字节).相邻房间的房号是连续的,相邻字节的地址也是连续的.计算机中通常以十六进制表示地址. ②. 不同类型占用的字节是不一样的,数据越大则占用的字节数越多.如在64位编译器下,int类型占据4个字节,char类型占据1

详解C语言中scanf函数使用的一些注意点_C 语言

 (一)基本介绍 Scanf是系统自带的函数,声明包含在stdio.h文件中,因此要是有该函数,必须加载#include<stdio.h>头文件.当执行到scanf函数时,程序就暂停等待用户输入,该函数只接受变量的地址,格式为&变量名.是一个阻塞式的函数,2用户输入完毕后,则将值赋值给变量,至此函数调用完毕.敲回车键告知计算机键入完毕. (二)使用注意 ①. 使用scanf函数输入一个字符变量.Char a; scanf("%c",&a); ②. 同时输入多

Linux下的删除过期文件操作

        在实际的软件开发项目中,经常会有实现删除过期文件的需求.即要求程序能够自动删除多长时间之前生成的文件.本文提供了一个示例代码,为相关的开发工作提供了参考.         程序如下(本程序用makefile进行编译): /*********************************************************************** 版权所有 (C)2014, Zhou Zhaoxiong.* * 文件名称: TestFileDelete.c* 内容

scanf()总结--从网上收来的,感觉很好,用来提醒自己,c语言真是博大精深!!【转】

转自:http://www.cnblogs.com/xiaocai905767378/archive/2011/06/01/2067526.html scanf杂谈          不得不说C语言真是博大精深!相比其他很多语言来说,C语言给人的表象就是结构精炼,内容简单.注意,那仅仅是表象!的确,C语言入门简单得很.但要真正做到掌握C语言甚至达到驾轻就熟的程度,谁敢说容易?       就从函数scanf说起吧.对于学习C的朋友来说,最熟悉的函数除了入门第一个"Hello World"