7
#include <stdio.h>
int
main() {
    char string[] = "my name is geany";
    int length = sizeof(string)/sizeof(char);
    printf("%i", length);
    int i;
    for ( i = 0; i<length; i++ ) {

    }   
    return 0;
}

「my」「name」「is」と「geany」を別々に印刷したい場合はどうすればよいですか。デリミネーターを使用することを考えていましたが、Cでそれを行う方法がわかりません

4

5 に答える 5

11
  1. 文字列の先頭へのポインタで開始
  2. 区切り文字を探して、文字ごとに繰り返します
  3. 見つけるたびに、長さの最後の位置からの文字列が異なります-それでやりたいことをしてください
  4. 新しい開始位置を区切り記号 + 1 に設定し、手順 2 に進みます。

文字列に文字が残っている間にこれらすべてを行います...

于 2012-09-13T16:00:43.873 に答える
2

環境が機能していたので、これを行う必要がありましたstrtok. ハイフンで区切られた文字列を分割する方法は次のとおりです。

     b = grub_strchr(a,'-');
     if (!b)
       <handle error>
     else
       *b++ = 0;

     c = grub_strchr(b,'-');
     if (!c)
       <handle error>
     else
       *c++ = 0;

ここで、aは複合文字列 として始まります。コードの実行後、値、 、を持つ"A-B-C"3 つのヌル終了文字列 、a、が生成されます。は、欠落している区切り文字に対応するコードのプレースホルダーです。bc"A""B""C"<handle error>

strtokのように、区切り文字を NULL に置き換えることで元の文字列が変更されることに注意してください。

于 2014-12-01T20:22:18.203 に答える
1

これにより、改行で文字列が分割され、報告された文字列の空白が削除されます。strtok のように文字列を変更することはありconst char*ません。違いは、begin/endは元の文字列 char へのポインタであるため、strtok のように null で終了する文字列ではありません。もちろん、これは静的ローカルを使用するため、スレッドセーフではありません。

#include <stdio.h> // for printf
#include <stdbool.h> // for bool
#include <ctype.h> // for isspace

static bool readLine (const char* data, const char** beginPtr, const char** endPtr) {
    static const char* nextStart;
    if (data) {
        nextStart = data;
        return true;
    }
    if (*nextStart == '\0') return false;
    *beginPtr = nextStart;

    // Find next delimiter.
    do {
        nextStart++;
    } while (*nextStart != '\0' && *nextStart != '\n');

    // Trim whitespace.
    *endPtr = nextStart - 1;
    while (isspace(**beginPtr) && *beginPtr < *endPtr)
        (*beginPtr)++;
    while (isspace(**endPtr) && *endPtr >= *beginPtr)
        (*endPtr)--;
    (*endPtr)++;

    return true;
}

int main (void) {
    const char* data = "  meow ! \n \r\t \n\n  meow ?  ";
    const char* begin;
    const char* end;
    readLine(data, 0, 0);
    while (readLine(0, &begin, &end)) {
        printf("'%.*s'\n", end - begin, begin);
    }
    return 0;
}

出力:

'meow !'
''
''
'meow ?'
于 2013-03-28T15:19:39.057 に答える
0
use strchr to find the space.
store a '\0' at that location.
the word is now printfable.

repeat
    start the search at the position after the '\0'
    if nothing is found then print the last word and break out
    otherwise, print the word, and continue the loop
于 2012-09-13T16:00:13.753 に答える
-2

車輪の再発明はしばしば悪い考えです。実装関数の使い方を学ぶことも良いトレーニングです。

#include <string.h>

/* 
 * `strtok` is not reentrant, so it's thread unsafe. On POSIX environment, use
 * `strtok_r instead. 
 */
int f( char * s, size_t const n ) {
    char * p;
    int    ret = 0;
    while ( p = strtok( s, " " ) ) { 
        s += strlen( p ) + 1; 
        ret += puts( p ); 
    }
    return ret;
}
于 2012-09-13T16:31:36.950 に答える