3

私はこれを理解するのに多くの問題を抱えています。C文字列があり、その最初の部分を削除したいと思います。「食品、量、カロリー」としましょう。これらの値をそれぞれコピーしたいのですが、コンマはコピーしません。カンマを見つけて、カンマの位置をメソッドに返します。それから私は使用します

strncpy(aLine.field[i], theLine, end);

「theLine」を配列「i」の最初の「end」文字のみでコピーするには(最初のコンマがあるので、初めて「end」は4になります)。しかし、ループ内にあるため、配列から「Food」を削除して、プロセスをやり直したいと思います。ただし、最初の部分を削除して(または配列ポインターを前方に移動して)残りの部分を保持する方法がわかりません。どんな助けでも役に立ちます!

4

5 に答える 5

3

必要なのは、区切り文字としてコンマを使用して文字列を切り落とすことです。

これを行うにはstrtokが必要です。これがあなたのためのサンプルコードです:

int main (int argc, const char * argv[]) {


    char *s = "asdf,1234,qwer";
    char str[15];
    strcpy(str, s);
    printf("\nstr: %s", str);
    char *tok = strtok(str, ",");
    printf("\ntok: %s", tok);
    tok = strtok(NULL, ",");
    printf("\ntok: %s", tok);
    tok = strtok(NULL, ",");
    printf("\ntok: %s", tok);

    return 0;
}

これにより、次の出力が得られます。

str: asdf,1234,qwer
tok: asdf
tok: 1234
tok: qwer
于 2010-12-13T04:58:50.387 に答える
2

元の文字列を保持する必要がある場合は、strtok。そうでない場合は、各セパレータをに置き換えて'\0'、取得した文字列を直接使用できます。

char s_RO[] = "abc,123,xxxx", *s = s_RO;
while (s){
    char* old_str = s;
    s = strchr(s, ',');
    if (s){
        *s = '\0';
        s++;
    };
    printf("found string %s\n", old_str);
};
于 2010-12-13T04:37:52.267 に答える
0

使用したい関数はstrtok()です

これが良い例です-http ://www.cplusplus.com/reference/clibrary/cstring/strtok/

于 2010-12-13T04:18:55.193 に答える
0

個人的には、strtok()を使用します。

抽出されたトークンを文字列から削除することはお勧めしません。文字列の一部を削除するには、残りの文字をコピーする必要がありますが、これはあまり効率的ではありません。

代わりに、自分の位置を追跡し、必要なセクションを新しい文字列にコピーする必要があります。

しかし、繰り返しになりますが、strtok()を使用します。

于 2010-12-13T04:21:16.507 に答える
0

カンマがどこにあるかがわかっている場合は、その時点から文字列を読み続けることができます。

例えば

void readTheString(const char *theLine)
{
    const char *wordStart = theLine;
    const char *wordEnd = theLine;

    int i = 0;
    while (*wordStart) // while we haven't reached the null termination character
    {
        while (*wordEnd != ',')
            wordEnd++;
        // ... copy the substring ranging from wordStart to wordEnd
        wordStart = ++wordEnd; // start the next word
    }
}

またはそのようなもの。
文字列も'、' ...で終わっていない限り、null終了チェックはおそらく間違っています。

とにかく、使用strtokする方がおそらく良い考えでしょう。

于 2010-12-13T04:30:58.107 に答える