C语言while循环中逗号表达式的用法(以及怎么读入引号中有空格的字符串!!!)

引言

今天在刷算法题的时候,遇到点儿问题:

对于如下的m组数据:

name "David Beckham"
email "david@beckham.com"

需求是把前者替换成后者,举个例子,遇到name,就把它替换成David Beckham(并且没有引号),所以我需要用hash表把它们的映射关系存起来。

可是问题来了。

这样的数据我该怎么读入呢?

对于name,我可以用cin, 可以后面“ ”内的内容还包括空格,这该如何处理呢? 用cin不行,因为cin用空格作为分隔符;用stringstream也不行,因为它也是按照空格切分的。

解决方法

最后的解决方案是利用getchar,一个字符一个字符的读!!

具体代码如下:


while(m -- ){
 string key, value;
 cin >> key; // 读入前者
 char c;
 //  读掉name 和“” 之间的空格,以及第一个引号
 while(c = getchar(), c != '\"'); 
 // 读入“ ”之间的内容,遇到第二个引号停止读入
 while(c = getchar(), c != '\"') value += c;
 hash[key] = value;
}

这种处理方法很好地解决了我的需求。

下面简单地介绍一下上述代码中while(___, _____)这种用法

以它为例:

 while(c = getchar(), c != '\"'); 

逗号表达式:从左往右读,并且以最后一个值作为结果。
在这里,对于while循环,首先执行c = getchar(),它读入一个字符,然后执行c != ‘"’,判断字符c 是否等于引号,如果满足c != ‘"’,则执行while循环体,如果不满足则不执行循环体。

再举一个简单的例子,

while(cin >> n , n){
	...
}

这里while循环也用到逗号表达式,先执行cin >> n, 读入一个数值n,然后第二个表达式,判断n是否为0,如果满足第二个表达式(不为零),则继续读入;

这种常用来读入:数据以0结尾。

总结

怎么读入引号具体的值? 具体要求是舍弃引号,并且引号内部有空格。

采用getchar来读:

string value;
char c;
while(c = gechar(), c != '\"'); //过滤掉第一个引号,以及前面的东西
while(c = getchar(), c != '\"') value += c; //读入第二个引号之前的字符

逗号表达式
依次从左往右执行,以最后一个表达式的值为结果。

对于引言中题目,有兴趣的读者可以尝试一下,是一道字符串处理题,本身不难。CSP认证201509-3 模板生成系统[C++题解]:字符串处理、模拟、哈希表、引号里面有空格的字符串怎么读入

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值