weemiee
@weemiee (weemiee)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【C言語】sizeofをうまく使えていない?

Q&A

Closed

以下のプログラムを記述し、実行しようとしたら、コンパイル時に「Timeout」という種類のエラーに引っかかりました。実行結果ではなくコードの書き方についての質問なので、プログラムの説明等は省略します。

失敗したプログラム
#include <stdio.h>

int main(){
	
	char buf[100],str[100];
	fgets(buf,sizeof(buf),stdin);
	sscanf(buf,"%s",str);
	
	int count=0;
	while( count < sizeof(str) / sizeof(str[0]) ){
		if(str[count]=='0'){
			count++;
		}
	}
	
	if(10-count>0){
		printf("10個まであと%d個です…\n",10-count);
	}else{
		printf("10個OKです!\n");
	}
	
}

標準入力により入力する文字列を構成する要素各々は、全て文字「0」である前提でお願いします。

while文の条件式で、countと比較する変数をsizeof(str) / sizeof(str[0])からint型の変数len(=strlen(str))に変えたら正常に実行出来たので、恐らくこの部分に問題があると予想しています。しかし、「要素の個数」という見方ではsizeofの使い方も正しいように思えて、間違いを受け入れられずにいます。sizeof(全体)/sizeof(先頭要素)strlen(全体)では、やはり考え方が異なるのでしょうか?

0

4Answer

@shiracamusさん、@Shuji_Kitamuraさん、ご回答ありがとうございます。
sizeofの方だと文字の数でなく、配列に格納可能な要素の最大数量になる(→文字が格納された要素の個数が最大数量より少ない場合、残りの空の要素も個数に入ってしまう(?))のですね。確かに、0の数が3個の時に条件式が3<100で固まる点も理解出来ます。プログラムについてのアドバイスも頂き、勉強になりました。

1Like

例えば 0 を 3個 入力したとしたら count++ の更新が 3 で止まり、while (3 < 100) の状態で無限ループしますよ。
else のときに break してはいかがですか?

#include <stdio.h>

int main() {
    char buf[100], str[100];
    fgets(buf, sizeof(buf), stdin);
    sscanf(buf, "%s", str);

    int count = 0;
    while (count < sizeof(str) / sizeof(str[0]) && str[count] == '0') {
        count++;
    }

    if (count < 10) {
        printf("10個まであと%d個です…\n", 10 - count);
    } else {
        printf("10個OKです!\n");
    }
}
0Like

sizeof(全体)/sizeof(先頭要素)だとその配列の要素の数(提示された例だと100固定)
strlen(全体)は文字列として見た時の文字数(ヌル文字('\0')までの要素数、提示された例だと入力された文字数)
になります。

なお、"0"以外を入力してしまうと、countがカウントアップできずに無限ループになってしまうので、判定している位置を表す変数と、count('0'の個数)は分けた方が良いかと思います。

0Like

sizeof(str)はコンパイルの時点で定数の100に確定してしまうため、実行時にstrにどんな文字を入れても変化しません。
だからchar str[1000];と宣言したらどんなことがあっても1000以外にはなりません。

0Like

Your answer might help someone💌