文字の配列内のゴミを取り除くにはどうすればよいですか?
質問
C プログラムを作成していますが、文字の配列で問題が発生し続けます。prinf を使用して印刷するとゴミが発生し続けます。これを印刷したときに得られるものの例を次に示します。
t.symbol の char は ああ
tabl[0].symbol の char は A です
tabl[1].symbol の char は
tabl[2].symbol の char は
tabl[3].symbol の char は d
tabl[4].symbol の char は e
tabl[5].symbol の char は f です
tabl[6].symbol の char は g です
tabl[7].symbol の char は h です
tabl[8].symbol の char は i です
tabl[9].symbol の char は x です
t[0].symbol の char は a0AÃ
t[1].symbol の char は b)@×4
t[2].symbol の char は くぅ*
t[3].symbol の char は ああ
t[4].symbol の char は 行く
誰かが文字の配列内のゴミを取り除く方法を教えてくれませんか?
これが私のコードです
#define MAX 100
#ifndef SYMBSIZE
#define SYMBSIZE 1
#endif
typedef struct tableme
{
char symbol[SYMBSIZE];
int value;
int casenmbr;
int otherinfo;
}tabletype;
int main(int argc, char **argv)
{
tabletype t[MAX];
t[3].symbol[0] = 'A';
t[0].value=1;
t[0].casenmbr = 7;
t[0].otherinfo = 682;
tabletype tabl[MAX];
tabl[0].value = 1;
tabl[0].symbol[0] = 'A';
tabl[1].value = 11;
tabl[1].symbol[0]= 'a';
tabl[2].value = 12;
tabl[2].symbol[0] = 'a';
tabl[3].value = 13;
tabl[3].symbol[0] = 'd';
tabl[4].value = 14;
tabl[4].symbol[0] = 'e';
tabl[5].value = 15;
tabl[5].symbol[0] = 'f';
tabl[6].value = 16;
tabl[6].symbol[0] = 'g';
tabl[7].value = 17;
tabl[7].symbol[0] = 'h';
tabl[8].symbol[0] = 'i';
tabl[9].symbol[0] = 'x';
t[1].symbol[0] = 'b';
t[0].symbol[0]= 'a';
t[2].symbol[0]= 'c';
t[4].symbol[0]= 'g';
printf("char at t.symbol is %s \n", t[3].symbol);
for( x=0;x<10;x++)
{
printf("char at tabl[%d].symbol is %s \n",x, tabl[x].symbol);
}
int j;
for(j = 0; j<5;j++)
{
printf("char at t[%d].symbol is %s \n",j, t[j].symbol);
}
return 0;
}
解決
考えられる問題は 2 つのうち 1 つです。本当に 1 文字だけが必要な場合は、次のようにして出力する必要があります。 %c
, 、 ない %s
このような:
printf("char at t.symbol is %c \n", t[3].symbol[0]);
本当に文字列が必要な場合は定義する必要があります SYMBSIZE
シンボルの最大長より 1 大きくなり、NUL (\0
) 末尾の文字。次のいくつかの方法で実行できます。
tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
strcpy(tabl[6].symbol, "g");
他のヒント
問題は、Cの文字列がNULL終端されていることです。しかし、あなたの配列は、1つの文字のための十分なだけ大きいので、ヌルで終了することはできません(これは、少なくとも2つの文字が必要です)。
なぜあなたはごみを得ていますか?あなたがtabl[0].symbol[0] = 'A';
を言うとき、メモリ内tabl[0].symbol[0]
であなたはA???
を持っていると我々は何であるか???
知りません。明らかに、時にはそれが(ゴミ)ではないですが、(あなたは正しい出力を取得する場所)時に0です。
この問題を解決するには、代わりにNULLで終わる文字列の単一の文字を印刷する%c
書式指定子を使用しています。あなたが本当に文字列を印刷したい場合は、あなたの文字列バッファを大きくし、それをNULLで終了するようにする必要があります:
SYMBSIZE = 10
は、その後、あなたは通常、文字列関数を使用したい、tabl[0].symbol[1] = '\0';
注意を持っています:
// copy "a" to that memory location, will be null-terminated.
strcpy(tabl[0].symbol, "a");
あなたのバッファが文字列のために十分な大きさでない場合は、、それはバッファをオーバーランします。
あなたの配列はで文字列を格納するのに十分な大きさではありません。あなたは、ヌル文字の余分なスペースを必要としています。 2にSYMBSIZEを変更するか、またはcharとしてそれを印刷。どちらか一方が動作するはずです。
編集:また、あなたはとにかくヌル文字を入れていません。それは\ 0に到達するまで、あなたがSYMBSIZE = 2
を行い、その後、文字列として印刷するためにsymbol[1] = '\0';
を作成する必要があると思いますので、文字列を印刷すると、続けるでしょう。
EDIT2:それとも、(全体ではなく、文字列の時に単一文字を印刷する)%s
にご%c
を変更する
あなたはprintf関数に%cを使用しなければならない文字を印刷する。
printf("char at t.symbol is %c \n", t[3].symbol);
あなたのコンパイラはフォーマット文字列が渡された値と一致しないことを警告する必要があります。 コンパイラの警告は理由があります。
、あなたは文字を印刷するために%cとない%sのを使用する必要があります。
printf("char at tabl[%d].symbol is %c \n",x, tabl[x].symbol);
この問題を解決する方法があります。我々はchar型の配列を初期化したら、基本的に我々はNULLにゴミ値でそれをオーバーライドする必要があります。
enter code here
void main()
{
int amsb[10];
int i,k,i1;
char arr[25];
clrscr();
printf("Enter the 10 element");
for( i1=0;i1<25;i1++) {
arr[i1]='\0';
}
for( k=0;k<25;k++) {
printf("%c",arr[k]) ;
if(arr[k]=='\0') {
break;
}
}
getch();
}