我有一行数据
211L CRYST1 60.970 60.970 97.140 90.000 90.000 120.000 P 32 2 1 6
我想在C中解析。具体来说,我想将P 32 2 1
解压缩为单个字符串。
当我使用strtok时,它使用所有空格作为分隔符,让我回到单个字符串
P
32
2
1
更简洁的措辞:
如果我有一个可变数量的字符串(在这种情况下为4),我如何将它们连接成一个字符串?
到目前为止我的代码:
while (fgets(line,sizeof line, PDBlist)!=NULL)
{
p=0;
pch=strtok(line,"\t");
sprintf(space[p],"%s",pch);
while(pch!=NULL){
pch=strtok(NULL," ");
p++;
sprintf(space[p],"%s",pch);
}
for(i=8;i<(p-1);i++){
if(i==(p-2))printf("%s\n",space[i]);
else printf("%s ",space[i]);
} }*
答案 0 :(得分:1)
如果行的格式始终是发布的示例,则使用strtok()
的替代方法是sscanf()
。它为行内容提供了一定级别的验证,无需额外编码(例如,验证float
值):
const char* input = "211L CRYST1 ....";
char first_token[32];
char second_token[32];
float float_1, float_2, float_3, float_4, float_5, float_6;
char last_token[32];
/* The '%31s' means read next sequence of non-whitespace characters
but don't read anymore than 31. 31 is used to leave space
for terminating NULL character.
'%f' is for reading a float.
'%31[^\n]' means read next sequence of characters up to newline
but don't read anymore than 31. */
if (9 == sscanf(input, "%31s %31s %f %f %f %f %f %f %31[^\n]",
first_token,
second_token,
&float_1,
&float_2,
&float_3,
&float_4,
&float_5,
&float_6,
last_token))
{
/* Successfully read 9 tokens. */
}
请参阅http://ideone.com/To4ZP的在线演示。
答案 1 :(得分:0)
感谢您的帮助!
这是我提出的解决方案:
如果您有可变数量的令牌,请首先使用每个令牌创建一个数组:
while(pch!=NULL){
pch=strtok(NULL," ");
p++;
sprintf(space[p],"%s ",pch);
}
首先使用strcpy然后使用strcat
提取所需的标记并将它们连接成一个字符串 for(i=8;i<(p-1);i++){
if(i==8)strcpy(dummy,space[i]);
else strcat(dummy,space[i]);
}
再次感谢!我认为在问题证明是问题时,我的问题更令人困惑。如果您有任何建议,请让我知道。
答案 2 :(得分:0)
E.g。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char line[128] = "211L CRYST1 60.970 60.970 97.140 90.000 90.000 120.000 P 32 2 1 6\n";
char field8_11[32];
char *p, *field[13];
int i=0;
for(p=line;NULL!=(p=strtok(p," \t\n"));p=NULL){
field[i++]=p;
}
sprintf(field8_11, "%s %s %s %s", field[8], field[9], field[10], field[11]);
printf("%s\n", field8_11);
return 0;
}