引言
今天在刷算法题的时候,遇到点儿问题:
对于如下的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++题解]:字符串处理、模拟、哈希表、引号里面有空格的字符串怎么读入