0

私はデータの行を持っています

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]);

        }   }*
4

3 に答える 3

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のオンラインデモを参照してください。

于 2012-08-13T20:49:32.940 に答える
0

助けてくれてありがとう!

これは私が思いついた解決策です:

トークンの数が可変の場合は、最初に各トークンで配列を作成します。

while(pch!=NULL){
                pch=strtok(NULL," ");
                p++;
                sprintf(space[p],"%s ",pch);    

            }

最初にstrcpyを使用し、次にstrcatを使用して、必要なトークンを抽出し、それらを1つの文字列に連結します。

 for(i=8;i<(p-1);i++){


                if(i==8)strcpy(dummy,space[i]);
                else strcat(dummy,space[i]);

            } 

再度、感謝します!私は、問題が判明したという質問で、問題をはるかに混乱させたと思います。何か提案があれば教えてください。

于 2012-08-13T21:20:38.647 に答える
0

例えば

#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;
}
于 2012-08-16T10:53:31.737 に答える