1

バイトまたはオクテットのように見える入力 c-string があります。私がそれを印刷するとき

printf("this is string[%s]\n", inputCstr);

全体を印刷するわけではありません。だから私はそれをループしようとしました

for (int i=0; i<len; i++) {
    printf("inputCstr[%d] = %c", i, inputCstr[i]);
}

これは文字列全体をループしますが、実際にはいくつかのインデックスをスキップします。たとえば、文字列が「abcdefg」の場合、次のようになります。

inputCstr[0] = a
inputCstr[2] = c
inputCstr[5] = f

ここで何が欠けていますか?

4

2 に答える 2

5

これは、コンソールによって特別に解釈される制御文字がバイト配列に含まれているためです。

あなたの場合、たとえば\r、カーソルを最初の列に移動し、次の行が前の行を上書きするようなものに遭遇した可能性があります。

あなたが試すことができます:

for (int i=0; i<len; i++) {
    printf("inputCstr[%d] = %02X\n", i, (unsigned char)inputCstr[i]);
}

そして、実際のコードを参照してください。

于 2012-11-29T17:30:13.610 に答える
4

ウィキペディアから ( http://en.wikipedia.org/wiki/Null-terminated_string ):

コンピューター プログラミングでは、ヌル終了文字列は、文字を含む配列として格納され、ヌル文字 ('\0'、ASCII では NUL と呼ばれます) で終了する文字列です。代替名は、C プログラミング言語と ASCIIZ を指す C 文字列です (C 文字列は ASCII の使用を意味するものではないことに注意してください)。

C 文字列の長さは、(最初の) NUL バイトを検索することによって検出されます。

あなたの場合、おそらくすべての文字に2バイトを使用するワイド文字列(ユニコード)を使用していると言わざるを得ません。これが、文字列を出力するときに最初の文字しか表示されない理由です (2 番目のバイトが '\0' であるため)。

文字列を正しく出力するには、次を選択する必要があります。

  1. 文字列を wide-char から char (wchar から char) に変更します。
  2. ワイド文字列を出力するには、printf の代わりに wprintf を使用します。

幸運を、

タル。

于 2012-11-29T17:29:21.313 に答える