0

このコード スニペットは次のとおりです。

printf("shell> ");
fgets(input, MAX_INPUT_SIZE, stdin);

//tokenize input string, put each token into an array
char *space;
space = strtok(input, " ");
tokens[0] = space;

int i = 1;
while (space != NULL) {
  space = strtok(NULL, " ");
  tokens[i] = space;
  ++i;
}

//copy tokens after first one into string
strcpy((char*)cmdargs, ("%s ",tokens[1]));
for (i = 2; tokens[i] != NULL; i++) {
  strcat((char*)cmdargs, ("%s ", tokens[i]));
}

printf((char*)cmdargs);

入力:を使用echo hello world and stuffすると、プログラムは次を出力します。

helloworldandstuff

strcat((char*)cmdargs, ("%s ", tokens[i]));行は tokens[i] の文字列をそれに続くスペースで連結する必要があるように私には思えます。strcat は文字列の書式設定では機能しませんか? 何が起こっているのでしょうか?

4

2 に答える 2

4

strcatは文字列の書式設定をサポートしていません。連結のみを行います。さらに、余分な括弧のペアを使用すると、C コンパイラはこれを関数に渡される引数としてではなく、コンマ演算子として解析します。

つまり、コンマ演算子がすべての式の副作用を呼び出すためstrcat((char*)cmdargs, ("%s ", tokens[i]));、呼び出しが発生しますが、最後の値が返されます。strcat((char*)cmdargs, tokens[i]);

を使用する場合はstrcat、次のように記述します。

strcat((char*)cmdargs, " ");
strcat((char*)cmdargs, tokens[i]);

同じことがstrcpy関数呼び出しにも当てはまります。

于 2013-09-15T07:00:00.047 に答える
2

必要に応じて、独自のフォーマット文字列連結関数を作成します。

(未テスト)

int strcatf(char *buffer, const char *fmt, ...) {
    int retval = 0;
    char message[4096];
    va_list va;
    va_start(va, fmt);
    retval = vsnprintf(message, sizeof(message), fmt, va);
    va_end(va);
    strcat(buffer, message);
    return retval;
}


...
strcatf((char*)cmdargs, "%s ", tokens[i]);
...
于 2013-09-15T07:23:15.627 に答える