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++题解]:字符串处理、模拟、哈希表、引号里面有空格的字符串怎么读入

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页