-2

文字列内でアンダースコアを使用しようとしましたが、コンパイラがchar配列に割り当てるバイト数を減らし、終了文字('\ 0')を実行するように見えます。

これを引き起こしているのは何ですか?アンダースコア文字をエスケープする方法はありますか?

ありがとう。

詳細については、次のコードを参照してください。

code:
#include<stdio.h>
#define ARRSIZE 6

char str_ex[][ARRSIZE] = {"aaaa", "bbbb_bbbb", "cccc", "dddd", "ffff_ffff", "eeee"};

int main(void)
{
    int i;
    for(i=0; i<ARRSIZE; i++)
        printf("%s\n", str_ex[i]);
    return 0;
}

compile:
user@ubuntu:~/test$ gcc -g test.c -o test -Wall -ansi
test.c:4:1: warning: initializer-string for array of chars is too long [enabled by default]
test.c:4:1: warning: (near initialization for ‘str_ex[1]’) [enabled by default]
test.c:4:1: warning: initializer-string for array of chars is too long [enabled by default]
test.c:4:1: warning: (near initialization for ‘str_ex[4]’) [enabled by default]

output:
user@ubuntu:~/test$ ./test
aaaa
bbbb_bcccc
cccc
dddd
ffff_feeee
eeee
4

6 に答える 6

4

コードARRSIZEでは、配列のサイズではなく、個々のサブ配列のサイズを決定します。つまりbbbb_bbbb、6文字で保存するように指示しているのです。代わりにポインタを保存できるかもしれません:

const char *str_ex[] = {....};
于 2012-12-08T13:25:30.387 に答える
3

これはアンダースコアによるものではなく、配列のサイズ設定方法によるものです。要素を6文字に制限し、アンダースコア付きの要素だけがその長さを超えています。他の4つのストリングは5つしか必要としないcharため、サイズ6の要素に適合します。

このように、これをポインタの配列として宣言する必要があります

char *str_ex[ARRSIZE] = {"aaaa", "bbbb_bbbb", "cccc", "dddd", "ffff_ffff", "eeee"};

または、次のように文字列にさらにスペースを与えます。

char str_ex[10][ARRSIZE] = {"aaaa", "bbbb_bbbb", "cccc", "dddd", "ffff_ffff", "eeee"};
于 2012-12-08T13:25:29.863 に答える
1

間違った寸法を設定しています。これを試して:

char *str_ex[ARRSIZE] = ....

これは、静的データを使用してC文字列の配列を初期化するために機能します。

于 2012-12-08T13:31:15.433 に答える
1

str_ex配列の配列であると宣言します。各サブ配列は6文字です。つまり、文字列は5文字(および終了文字)のみにすることができ'\0'ます。5文字より長い文字列がいくつかあります。これは、コンパイラが警告するものです。

于 2012-12-08T13:25:39.430 に答える
1

各文字列の長さは最大でARRSIZE文字である必要がありますが、アンダースコア付きの文字列の方が大きくなります。

于 2012-12-08T13:27:16.713 に答える
0

ARRSIZE各文字列に割り当てられた文字数を指します。問題は、ARRSIZEとが6両方とも6文字より長いということです。アンダースコアは関係ありません。"bbbb_bbbb""ffff_ffff"

于 2012-12-08T13:25:20.873 に答える