2012-02-03 128 views
2

我必须将一个字符串拆分为几个字符串。实际上,我需要的是解析来自以下格式(i9,i9,i2)的文件的一些输入。将一个字符串解析为多个字符串

I9表示十进制数为: (5blankspaces)4567

,所以我需要检索的数字正确。宽度总是固定的,所以每个数字都必须遵守。 该格式的正确的实例将是

(5spaces)4567(6spaces)453(1space)2 或 (5spaces)4567(6spaces)45322(其中,图22是用于I2参数在这种情况下)

数字之前的空格给了我头痛,所以我想我可以将每个参数拆分为一个字符数组,然后将其转换为整数,因为%d指定符忽略了所有空格,我不知道如何使用宽度作为以及忽略空格..(如果可以这样做,我的意思是,解析所有的整数,请说这么!!)

如果不是......好吧,我需要帮助来解析e很字符串转换成字符串,到目前为止,我已经做到了这一点,但它不工作:

while (fgets(buffer, 600, f)) { 
    sscanf(buffer, "%9[^\n]s %9[^\n]s %2[^\n]s", arg1, arg2, arg3); 
    .... 
} 

请,任何帮助将不胜感激!

+5

C或C++?选择你的命运! :) – 2012-02-03 09:30:32

+0

[解析逗号分隔的std :: string]可能的重复(http://stackoverflow.com/questions/1894886/parsing-a-comma-delimited-stdstring) – 2012-02-03 09:34:18

+0

可能的重复[解析字符串到长C](http://stackoverflow.com/questions/7930167/parsing-string-to-long-in-c) – 2012-02-03 09:38:08

回答

3

答案是C.这就是为什么我使用变量名称new

使用strncpy()并正确终止结果

char part1[10], part2[10], part3[3]; 
const char *new = "  4567  45322\n"; /* the line read */ 

strncpy(part1, new, 9); part1[9] = 0; 
strncpy(part2, new+9, 9); part2[9] = 0; 
strncpy(part3, new+18, 2); part3[2] = 0; 

我建议你不要试图编写多语言源文件。

+3

哈哈,作为一个变量名称的'新'是一个很好的方式来绊倒所有的微软受害者: - ) – 2012-02-03 09:36:04

+0

喜欢命名约定 – dalle 2012-02-03 09:46:51

+0

谢谢大家的回答! (2spaces)137411365101(3spaces)0.93真正的格式是i7 i7 f7,但是当它解析0.93它存储(空间)1(空间)0.93这是正确的(宽度7),但它是不是像这样在文件中(正如我上面写的)..那1个号码不应该在那里:S请帮助! – Lucia 2012-02-03 10:58:57

2

在C++中,使用substr(),与通常的字符串沿到整数转换:

#include <string> 

std::string s = "  1234  78922"; 

std::string s1 = s.substr(0, 9); 
std::string s2 = s.substr(9, 9); 
std::string s3 = s.substr(18); // or substr(18, 2) 

int n1 = std::stoi(s1), n2 = std::stoi(s2), n3 = std::stoi(s3); 

应用通常的长度检查在适当情况下,以验证输入的确是正确的格式。