文字の配列変数を一文字ずつ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Sakana

文字の配列変数を一文字ずつ

#1

投稿記事 by Sakana » 15年前

test.txtをfgets関数で一行ずつ読み込み、char型の配列変数buf[3]の中身を
一文字ずつ表示するプログラムを書きましたが、画面に文字が表示されません

テキストファイルの中身はabcです


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void){

	FILE *fin;
	int i;
	char filename[80]="test.txt", buf[3];
	if((fin=fopen(filename, "r")) == NULL){
		printf("を開けませんでした\n");
		exit(1);
	}

	while(fgets(buf, 3, fin) != NULL){
	/*入力データをbufに読み込む*/

		//文字を一文字ずつ表示する
		for(i=0; i>3; i++){
		printf("%s", buf);

		}
		
	}
	fclose(fin);
	getch();
return 0;
}


fgetsの次の行からは、bufにそれぞれ
buf[0]='a'
buf[1]='b'
buf[2]='c'
buf[3]='\0'
と入っているはずなので、画面にはabcと表示されるはずなのですが、コンパイルをしても特にエラーも見当たらなく、どこが間違っているのかわかりませんでした
よろしくお願いします

Mist

Re:文字の配列変数を一文字ずつ

#2

投稿記事 by Mist » 15年前

いくつか間違いがあります。

> buf[0]='a'
> buf[1]='b'
> buf[2]='c'
> buf[3]='\0'

このようにはなりません。
char buf[3];と宣言していますのでbuf[0]~buf[2]までで、buf[3]は存在しません。
一回目のfgetsで以下のようにセットされて、2回目のfgetでcを読むことになります。
buf[0]='a'
buf[1]='b'
buf[2]='\0'

char buf[4]として、fgets(buf, sizeof(buf), fin)としましょう。

> printf("%s", buf);

%sは文字列を出力するものなので文字列のアドレスを渡さなければ正しく動作しません。
一文字だけ表示する場合は%cです。

Sakana

Re:文字の配列変数を一文字ずつ

#3

投稿記事 by Sakana » 15年前

配列について間違った覚え方をしていました・・・
ご指摘頂いた点を修正したところ、abcと表示されました
ありがとうございます

閉鎖

“C言語何でも質問掲示板” へ戻る