C++ 的 istringstream 和空格

4
我有这样的输入:(50.1003781N, 14.3925125E),它被存储在const string & input中。我想要做的是提取括号,获取代表GPS坐标的数字-50.1003781,保存N,并对第二个坐标执行相同的操作。
下面是我的代码:
istringstream iStream(input);

char brackets[2]; //To store the brackets 
char types[2]; //To store if it is N/S or W/E
char delim; //To store ","
double degrees[2];

iStream >> brackets[0] >> degrees[0] >> types[0] >> delim;

//The delim loads the "," and here goes my problem with whitespace which is next

iStream >> degrees[1] >> types[1] >> brackets[1];

但是加载degrees[1]时失败了,它加载了零,并且tellg()显示-1,可能是因为逗号后面有空格。解析后的字符串应该像这样:
cout << brackets[0]; // "("
cout << degrees[0]; // "50.1003781"
cout << types[0]; // "N"
cout << delim; // ","
cout << degrees[1]; // "14.3925125"
cout << types[1]; // "E"
cout << brackets[1]; // ")"

我尝试了skipws和noskipws,但没有效果。 请问有人可以帮忙吗?非常感谢。

1个回答

8
问题比较微妙,但与 14.3925125E 中的 E 被解析为科学计数法有关。在数学中,E 后缀是将其操作数乘以 10 的指数幂乘以随后的数字的缩写。例如,科学计数法中的 5.23E4 表示为 5.23 * 10^4
在您的情况下,由于数字没有跟随 E 后缀,因此它被解析为无效的浮点文字面量,因此该数字未分配给 degrees [1]
建议不要直接读取值到 degrees [1] 中,而是建议先将其读入字符串中,从 E 中解析浮点部分,然后将其转换并分配给各自的变量。

快速提问,为什么以下代码的行为与问题中的代码不相似?[code](http:// pastie.org/8971910) - viki.omega9
@viki.omega9 你没有描述这两个程序之间的行为差异,但实际上只有在floatdouble类型的对象中才能保存科学计数法中的浮点值。你正在提取一个整数,因此它只取整数部分(10)。对于程序的第二部分,你提取到了错误的变量,应该执行ss >> extra >> num >> deg请参见此处 - David G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接