从文本C++中提取字符串数据

Jos*_*lgh 3 c++ visual-c++

我目前正在编写一个需要从文本文件中提取字符串和数字数据的c ++程序.数据格式如下;

3225 C9+     ELECTR  C8      C        *      1.00E-6  -0.30       0.0
Run Code Online (Sandbox Code Playgroud)

第一个条目是整数,接下来的5个条目是字符串,最后3个是浮点数.没有字符串长度超过7个字符.

我正在逐行读取文件,然后使用提取数据;

sscanf(ln.c_str(),"%d  %s  %s  %s  %s  %s  %e  %e  %e",
&rref[numre],&names[numre][0],&names[numre][1],&names[numre][2],&names[numre][3],
&names[numre][4],&nums[numre][0],&nums[numre][1],&nums[numre][2]);
Run Code Online (Sandbox Code Playgroud)

这很好用,直到我遇到一条线;

  3098 SIC2H3+ ELECTR  SIC2H2  H        *      1.50E-7  -0.50       0.0
Run Code Online (Sandbox Code Playgroud)

其中一个托盘是完整的7个字符长.在这种情况下,我得到;

names[3097][0] = "SIC2H3+ELECTR"
Run Code Online (Sandbox Code Playgroud)

和,

names[3097][1] = "ELECTR"
Run Code Online (Sandbox Code Playgroud)

任何人都有任何想法...他们将不胜感激!

das*_*ght 6

最可能的问题是声明names:如果你声明它持有7个字符或更少,并且忘了分配空间来终止零,你就会得到你所描述的结果.

char names[MAX][4][7]
Run Code Online (Sandbox Code Playgroud)

将有足够的空间用于长度为6或更短的字符串; 对于长度为7的字符串,您需要

char names[MAX][4][8]
Run Code Online (Sandbox Code Playgroud)

  • @JoshuaGreenhalgh C字符串不会与字符一起存储长度,因此为了支持可变长度字符串,我们制定了一个约定,即在字符串中最后一个有意义的字符之后放置零(一个不可打印的字符).所有输入例程都这样做,并且所有输出例程最终都期望为零.这就是你需要分配`max_length + 1` chars来存储`max_length`字符串的原因. (2认同)