【C言語基礎問題11】配列に関する問題解析


1.文字列:Hello!配列bに付与される文は()である.
A)char b[10]={'H','e','l','l','o','!'};
B)char b[10];b="Hello!";
C)char  b[10];strcpy(b,"Hello!");
D)char b[10]="Hello!";
答え:B;定義時にのみ=を使用して初期化でき、単独で値を割り当てることはできません.
2.次のプログラムの実行結果は()です.
main()
{ 
    char ch[7]={“65ab21”}; int i,s=0;
    for(i=0;ch[i]>='0' && ch[i]<='9';i+=2) 
        s=10*s+ch[i]-'0';
    printf("%d
",s); }

(A) 2ba56       (B) 6521     (C) 6       (D) 62
答え:C
3.次の説明があります.
int a[12]={1,2,3,4,5,6,7,8,9,10,11,12};
char c='a',d,g;
値が4の式は()です.
(A)a[g-c]       (B)a[4]         (C)a['d'-'c']     (D)a['d'-c]
答え:D
4.以下の説明で正しくないのは()です.
(A)文字型配列に文字列を格納可能
(B)文字型配列全体の入出力が可能
(C)整数配列全体の入出力が可能
(D)代入文に代入演算子"="で文字型配列を全体的に代入することはできません
答え:C;C言語では、配列要素を1つずつ参照することしかできず、次に配列全体を参照することはできません.文字配列の入力、出力は、文字列全体を一度に入力または出力できます.だから、選択肢Cの言い方は正しくありません.
5.以下の手順がある
main()
{
     char p[]={'a', 'b', 'c'}, q[]="abc";
     printf("%d %d", sizeof(p),sizeof(q));
};
プログラム実行後の出力結果は()です.
(A)4 4            (B)3 3            (C)3 4              (D)4 3
答え:C;sizeof()は、統計バイト長が0、0を含む.strlen()統計長には0、0は含まれません
6.次のプログラムの実行後の出力結果は()です.
main()
{ 
    char arr[2][4];
    strcpy(arr,"you"); 
    strcpy(arr[1],"me"); 
    arr[0][3]='&';
    printf("%s 
",arr); }

(A)you&me   (B) you   (C) me     (D) err
答え:A
7.次のプログラムを実行する場合、ABCを入力すると、出力結果は()となります.
#include "stdio.h"
#include "string.h" 
main()
{ 
    char ss[10]="1,2,3,4,5";
    gets(ss); 
    strcat(ss, "6789"); 
    printf("%s
",ss); }

(A) ABC6789   (B) ABC67   (C) 12345ABC6    (D) ABC456789
あなたが定義SS配列には文字列がありますが、gets関数で入力ABCは元の文字列を上書きするので、新しい配列はSS[10]=「ABC」で、次のstractは文字列接続関数が文字列「6789」をABCの後ろに接続する.出力結果はABC 6789である.
8.定義がある場合:int aa[8];次の式では配列要素aa[1]のアドレスを表すことができないのは()である.
(A) &aa[0]+1   (B) &aa[1]     (C) &aa[0]++   (D) aa+1
配列のアドレスは、配列の最初の要素のアドレスと同じです.配列中の最初の要素アドレスの表現方法は&aa[0]であり、それと等価なのは&aa[0]++であるため、オプションCが正しくない.オプションAは配列の1番目の要素のアドレスを1ビット下に移動する2番目の要素aa[1]のアドレスである.Bは配列の2番目の要素のアドレスでもあり、オプションDではaaが配列のアドレスを表し、1が配列の最初のアドレスを表した後に1ビット移動し、すなわち配列要素の2番目の要素aa[1]を表すアドレスを表す.したがって、4つのオプションのうちCが選択されます.
9.以下の手順がある
#include "stdio.h" 
#include  
main()
{ 
    char a[]={'a','b','c','d','e','f','g','h','\0'};
    int i,j;
    i=sizeof(a); 
    j=strlen(a); 
    printf("%d,%d
",i,j); }

プログラム実行後の出力結果は()です.
(A) 9,9  (B) 8,9  (C) 1,8    (D) 9,8
sizeof()関数は文字列に占めるバイト数を返し、strlen関数は文字列の長さを返します.'0'は空の値と呼ばれ、記憶領域を占有しますが、列の長さには計上されません.
10.以下の手順がある
main()
{ 
    char a[7]="a0\0a0\0"; 
    int i,j; 
    i=sizeof(a); 
    j=strlen(a); 
    printf("%d %d
",i,j); }

プログラム実行後の出力結果は()です.
(A)2 2             (B)7 6          (C)7 2            (D)6 2
文字配列の要素数は定義時に決定され、格納された内容に関係なく、本題の文char a[7]は7つの文字要素からなる文字配列を定義し、そのsizeof(a)=7である.文字配列は文字列を格納することが多いが、格納される文字列の長さは配列の長さに直接関連していない.C言語では、文字列は先頭文字から始まり、最初の値がASCIIコード0の文字で終わり、0以外の文字数が文字列の長さであることが規定されている.本題では、a[0]='a',a[1]='0',a[2]=0、先頭文字位置a[0]から1番目のASCII値が0の文字a[2]まで、0以外の文字が2つあるのでstrlen(a)=2とする.
11.以下の記述で誤りは()である.
(A)doubleタイプ配列の場合、配列名で配列全体を直接入力または出力することはできません
(B)配列名は、配列が占める記憶領域のヘッダアドレスを表し、その値は変更できない
(C)プログラム実行中、配列要素の下付き文字が定義された下付き文字の範囲を超えた場合、システムは「下付き文字の境界を越える」エラー情報を与える
(D)配列要素の個数は、初期値を付与することによって決定することができる
[解析]配列の下付き文字は0から始まり、配列要素の下付き文字が定義の範囲を超えている場合、システムは「下付き文字の境界」の情報を出さず、実行中にエラーが発生するため、プログラミング時に必ず下付き文字が境界を越えているかどうかをチェックします.
12.以下の記述の中で正しいのは()である.
#include  
main()
{ 
    char p[]={'a', 'b', 'c'}, q[10]={'a', 'b', 'c'};
    printf("%d %d
", strlen(p), strlen(q)); }

(A)pとq配列に初期値を設定すると、文字列終端子が自動的に追加されるので、出力の長さはいずれも3となる
(B)p配列に文字列終端子がないため、長さは確定できない.ただしq配列の文字列長は3
(C)q配列に文字列終端子がないため、長さは確定できない.ただしp配列の文字列長は3
(D)pとqの配列には文字列終端子がないため,長さは特定できない.
strlenは「0」で終わる文字列の長さを計算する関数で、関数の値は文字列の実際の長さであり、「0」を含まない.題中の「q[10]={'a','b','c'}」は配列サイズ、すなわち配列が実際に割り当てられた記憶空間を与えるが、この文字列は上位3つの記憶セルのみを占有し、残りの記憶セルシステムは自動的に「0」を加えるため、配列qの長さは3である.p配列には文字列終端子がないため、文字列の長さは決定できません
13.文字列を正しく定義できる文は()です.
(A)char str[]={′064′};
(B)char str="kx43";
(C)char str=";    
(D)char str[]="\0";
char宣言文字変数文字変数の仕様:1バイトのメモリ領域を占有する(文字列はその長さに基づいてメモリに占有するバイト数を決定し、空の文字列のみが1バイトである.)ため、一般的には文字型または整数型のデータで処理される.したがってchar str=「kx 43」は文字'k'のみを
14.次の配列定義でエラーが発生したのは()です.
(A)int x[][3]={0};
(B)int x[2][3]={{l,2},{3,4},{5,6}};
(C)int x[][3]={{l,2,3},{4,5,6}};
(D)int x[2][3]={l,2,3,4,5,6};
[解析]オプションB)の行数は2と定義されていますが、実際には3行の要素を格納する必要があるためエラーです.
15.キーボードからスペース文字を含む文字列を読み込む場合は、関数()を使用します.
(A)getc()        (B)gets()        (C)getchar()   (D)scanf()
[解析]scanf()文は「スペース」で異なる文字列を区別する.getc()とgetchar()文は文字列の読み込みに使用できません.
16.出力結果:
main()
{
    int a[3][3]={{1,2,9},{3,4,8},{5,6,7}},i,s=0;
    for(i=0;i<3;i++) 
        s+=a[i][i]+a[i][3-i-1]; 
    printf("%d
",s); }

17.出力結果Yes
#include  
main()
{ 
    char ch[]="abc",x[3][4]; 
    int i;
    for(i=0;i<3;i++) 
        strcpy(x[i],ch);
    for(i=0;i<3;i++) 
        printf("%s",&x[i][i]); 
    printf("
"); }

%sが00に遭遇すると出力が停止します