0

私はCが初めてです。

char 配列 (文字列) を取り、区切り記号で 2 つの文字列に分解しようとしています。これが私のコードです:

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>

int main() {
    char line_array[260];
    char *line = line_array;
    scanf("%s", line_array);
    char *line2 = strdup(line);
    char *command = strtok(line2, " "); // WORKS FINE = open
    printf("%s %c\n", command, *(line+4)); // PRINTS: open (prints only command, *(line+4) is empty)
    return 0;
}

文字列の最初の部分(「works fine = open」と表示されている部分)を取得した後に達成しようとしているのは、すべての文字を command_array[strlen(command)] から配列の最後まで出力することですが、私が試したことがうまくいきました。

4

6 に答える 6

1

新しい更新の質問とコードを読んだ後、私は最終的にあなたの問題を知っています。問題は、文字列を取得し、scanf文字列をバッファに読み込む方法ですが、空白またはCR/LFを新しい入力の新しい開始として扱います。 、「abcdefg 9」と入力scanf("%s",value)すると、値のみが取得abcdefgされ、stdinバッファに「9」が残ります。したがって、を使用gets(value)してすべての入力を取得してから、を使用する必要がありますstrtok

于 2012-09-22T08:11:15.930 に答える
0

あなたの最後の行.....あるべきで

printf( "%s\n", ( line + 4 ) );

あり、あなたはあなたが期待していることを終えています。

理由:

1。%cは、一度に1文字を除いて印刷できません。

2.文字列は常にC言語のベースアドレスを処理するため、アスタリスクも削除する必要があります。あなたの質問が答えられることを願っています。

于 2012-09-22T09:04:22.720 に答える
0

C の式では、すべてchars暗黙的にintsfirst に変換されます。char引数が可変引数関数 ( など) に渡されると、printf()それらも暗黙的に に変換されintsます。しかし、私はそれで問題を見ていません。

ただし、私が見ているのは、偶然にも整数である をexplodestr()返す return ステートメントがないことです。char

于 2012-09-22T07:48:58.483 に答える
0

目的が 1 行を読み取り、最初のスペース文字で分割することである場合は、次の方法を試すことができます。

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>

int main() {
  char* line = NULL;
  size_t linesiz = 0;
  if (getline(&line, &linesiz, stdin) > 0) {
    char* space = strchr (line, ' ');
    if (space) {
       *space = (char)0; // to end the chunk before 
       printf ("first chunk is %s\n", line);
       printf ("after space have %s\n", space+1);
    }
  }
  return 0;
}

コンパイラですべての警告を有効にし、デバッグ方法を学ぶことを忘れないでください。Linux では、デバッガーでコンパイルしgcc -Wall -g て使用することを意味します。gdb

ところで、すべての行が単語 (スペースなし) で始まり、スペース文字 (スペース、タブ、改行、改行など) と整数で始まることがわかっている場合は、次のように宣言できます。

int i=0;
char buf[30];
memset (buf, 0, sizeof(buf)); // zero the buf

次に使用する

if (scanf("%30s %d", buf, &i)>=2) { /* do something with buf & i */ }

のmanページを読みたいと思う人は多いでしょう。feature_test_macros(7)

于 2012-09-22T07:49:33.557 に答える
0

strtokループで呼び出すだけです。同じ文字列を解析する場合は、最初の引数を NULL に設定します。これにより文字列が変更されますが、この例ではコピーを作成して使用しています。

#include <stdio.h>
#include <string.h>

int main(void)
{
    char line_array[260];
    char *line, *p;

    fgets(line_array, sizeof(line_array), stdin);
    line = strdup(line_array);

    p = strtok(line, " ");
    while (p) {
        puts(p);
        p = strtok(NULL, " ");
    }

    free(line);
    return 0;
}
于 2012-09-22T08:42:19.930 に答える
0

あなたが使用することができます:

printf("%s\n", filename+4);

5番目の文字から文字列の最後までの文字列ファイル名を出力します

%c は 1 文字のみを出力します

*(filename+4) は、文字列 filename から 5 番目の文字コードを取得します。

filename+4 は、文字列 filename の 5 番目の文字のアドレスを示します

于 2012-09-22T07:44:46.333 に答える