有关“scanf()“ 分号内容的一个想法

##谨此纪念下 c小程/c大程 学习过程中报过无数次错的 scanf 函数.

##警告: 如果您要阅读这篇文章,请原谅其作者特有的 口齿不清 和 乱用名词.

问题起因:

学c的时候一直搞不明白 scanf 这个函数,尤其是当其牵扯到空格,回车等输入的时候.今天和室友Debug 的时候由Bug顿悟了一些乱七八糟的东西,特于此记录一下.

具体想法:

简而言之, scanf() 函数中的 "" 内的内容或许可以看作是 有序的集合 或者 向量. 使用 scanf 函数时,计算机会将引号中的内容与输入缓存中的内容进行对比,直到输入缓存中的内容无法与引号内的内容对应时停止,比如下面一个函数:

#include <stdio.h>

int main(){
	char a='6',b='6'; //初始化,向a,b中输入'6'这一个字符
	scanf ("%c sb %c",&a,&b); 
    //在上面这一行函数中,引号内为["%c"," ","s","b"," ","%c"]这样一个有序的集合.
    //其中 %c 可以可看作是包括任何字符的集合.
	printf("%c%c",a,b);
	return 0;
}

//在执行这一个程序时,如果我们输入 "A sb B" (注意空格),那么我们会得到程序打印的 "AB" 
//但是如果我们输入 "A nb B" 那么我们会得到 "A6" (即a中存储了我们输入的"A",但是b中仍然存储的是初始赋予的字符 "6")
//在输入 "A nb B" 后, scanf函数在读到 "n" 的时候会发现其与 "s" 不同而停止.

在这个程序中,如果输入 A sb B ,计算机会打印 AB ,即字符 A 和字符 B 被分别存入了 a,b 内; 但是如果输入 A nb B ,那么只有字符 A 被存入变量 a 中, 之后scanf在读到 "n" 的时候发现其与函数内对应位置的 "s" 不同而停止读取,因此字符 B 没有存入变量 b 中,而留在了输入缓存中,之后也不会打印字符 B.

这样我们便可以解释为什么有时候会出现诸如 scanf("%d %d",&a,&b) 的形式了,该形式可以利用引号内的空格来对应(消掉?)输入缓存的空格,从而实现正确的读取.

这样我们似乎也可以用来消掉 \n, 如下图所示:

 

## 先水到这里~~,打算猛补一下函数手册先.

## 此外建议在站里搜索一下 scanf("%[^\n]",&a) 中的关于 %[^\n] 的部分,这也可以说是我部分的顿悟来源了.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值