C语言学习中遇到的问题和解决方法

问题1:将两个变量的数据类型相互交换后,没有得到想要的结果。
结论:对于%c的scanf,要么scanf(" %c",…),要么在之前加上while((c = getchar()) != ‘\n’);
之前的代码和显示结果如下:
在这里插入图片描述
在这里插入图片描述
其中name的数据类型是char,pwd的数据类型是int。
然后我将两个变量的数据类型调换位置,即name的数据类型变成int,pwd的数据类型变成char,后面与变量对应的转义字符也改变。
之后的代码和结果显示如下:

char name;
int pwd;
printf("请输入用户名:");
scanf("%d",&name);
printf("请输入密码:");
scanf("%c",&pwd);
printf("用户名是%d,密码是%c",name,pwd);

当输入7011后敲击回车,第二排内容立马弹出
解决方法1:只需要在scanf("%c",&name);里面的%c前面加上一个空格即可。(不用在%d前面加空格)
解决后的代码和结果如下:

char name;
int pwd;
printf("请输入用户名:");
scanf("%d",&name);
printf("请输入密码:");
scanf(" %c",&pwd); //加了空格
printf("用户名是%d,密码是%c",name,pwd);

在这里插入图片描述
解决方法2:在第一个scanf和第二个scanf之间加上一行代码
while((c = getchar()) != '\n');即可
解决后的代码和结果如下:

char name;
int pwd,c;
printf("请输入用户名:");
scanf("%d",&name);
while((c = getchar()) != '\n');
printf("请输入密码:");
scanf("%c",&pwd);
printf("用户名是%d,密码是%c",name,pwd);

在这里插入图片描述

2019年2月18日22:30分,我人生中第一个从构思到打代码到实现、完全自主的代码终于成功了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们知道在printf中若要引用,需要在字符串后面用逗号隔开并列出要引用的内容。在打代码的时候我便注意到这里的c d e f并不需要加上双引号,但之前有条代码是加了双引号的
在这里插入图片描述
经过我的回忆和比较,我便得出:在printf中若是引用数字或者变量,不用加双引号;若是引用字符或者字符串,就要加上双引号。
问题2 scanf的“小心机”
笔者最近做了一个打怪兽的“小游戏”,最初的正确代码如下:
在这里插入图片描述
编译结果如下:在这里插入图片描述
但是,由于“攻击值”对应的变量是char,所以再输入“攻击值”时,一旦输入的数字超出个位数,则会出现下面这种结果:
在这里插入图片描述
“攻击值”输入12,按下回车键立马让你输入恢复值。
注意:我当时还没有注意到这点,因为char在输入时可以这样:char a = 100,等号后面的数字从-128到127都可以,但是在其他输入方式尤其是要引用%c的时候,就只能输入“字符”即单个数字或字母。
在没有注意到这一点时,我对代码进行了改进,改进结果如下:
在这里插入图片描述
我加入了“暂停”,就不会一下子跳到恢复值了,编译结果如下:
在这里插入图片描述
啊哈,我当时想,这下终于对了。但是拿出计算器手动计算时,我发现最终算出的生命值不对!其实这条代码仍然是正确的,它的echo %errorlevel%为零。这是我才反应过来,我试了下只输入个位数,最终的编译结果才变正确的。
所以,上面这个编译结果,其实是错误的!编译器在计算时,由于攻击值只能输入个位数,所以这里的攻击值其实不是12!
问题:str(len)喜欢fgets的回车符
在学到字符数组的时候,我学到了三种输入方法:scanf gets fgets。scanf遇到空格就会停止输入,其他两种则不会。然而gets fgets两者在某些情况下表现得也不一样。
1.喜欢回车键的fget
使用fgets输入:

char name[32];
	int len;
	printf("请输入姓名:");
	fgets(name,5,stdin);
	len = strlen(name);
	printf("字符串的长度为%d", len);

在这里插入图片描述
scanf gets fgets都有输入缓冲区,回车键也会在输入缓冲区中。一串字符串包括:字符串+休止符+回车符 。字符长度是指字符串的长度。但是一旦fgets与str(len)相配,str(len)就会把输入缓冲区的回车符也包括进字符串长度里。

使用gets输入:

char name[32];
	int len;
	printf("请输入姓名:");
	gets(name);
	len = strlen(name);
	printf("字符串的长度为%d", len);

在这里插入图片描述
而gets与str(len)相配,str(len)就不会把回车符当做字符串长度了。

与字符串长度strlen相关的,还有个字符串的比较,strcmp。strcmp将两个字符串的a[0] a[1]根据其对应的ASC数值依次比较。但是strcmp一旦与fgets相遇,也会出现差错。

char str1[32];
char str2[32] = "Rock";
fgets(str1,sizeof(str1),stdin);
printf("数值是%d", strcmp(str1,str2));
return 0 ;

sizeof(str1)在这里等于32,若我输入一个“Rock”则只有5个字符远小于32,那么此时fgets就会把回车符也包括进去,一共就有6个字符。
str1的输入缓冲区包含:‘R’ ‘o’ ‘c’ ‘k’ 0 ‘\n’
str2的输入缓冲区包含:‘R’ ‘o’ ‘c’ ‘k’ 0
由于’\n’也有对应的·ASC数值,所以编译结果为str1>str2,结果小于0。
总结起来就是:strcmp比较字符串有条规律,就是除去0 ‘\n’的情况下先依次比较ASC数值。若前面的字符串一模一样,则看后面有没有0或者’\n’
问题:字符getchar putchar与scanf printf的区别

char a;                                
	scanf("%d",&a);
	printf("%d",a);
	return 0;

输入100,输出100

char a;
	a = getchar();
	printf("%d",a);
	return 0;

输入100,输出49

char a;
	scanf("%d",&a);
	putchar(a);
	return 0;

输入100,输出d

char a;
	a = getchar();
	putchar(a);
	return 0;

输入100,输出1
总而言之:对于putchar putc(stdin) 而言,它们都只管字符,并且这里的字符可以理解为“图像”。比如我输入一个“1”其实并不是输入了一个“数字1”,而是一个“图像1”,而这个“图像1”在ASC数表里对应着一个数字。
同样对于getchar getc(stdin)而言,它们也只管字符。
目前学到的可以直接引用不用申明变量的有:strlen() strcmp( , ) sizeof() 所有字符串比较的运算比如30>5 20!=30等都可以直接引用不用申明。

#include <stdio.h>
#include <stdbool.h>
int main(void){
	printf("%d\n",3 > 5);
	printf("%d\n",30 > 5);
	if(true){
	printf("真");
	}
	if(false){
	printf("假");
	}
	return 0;
}

就可以像上面这样,就不用再申明一个比如"int len; len = 3 > 5;"之类的了。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值