본문 바로가기

프로그래밍 언어 문제/C

[C언어] 연습문제2

[문제]

문자열을 저장하고 있는 파일을 열어서 A와 P로 시작하는 단어의 수를 세어서 출력하는 프로그램을 작성해 보자.
단, 모든 단어는 공백문자(스페이스 바, \t, \n)에 의해서 구분된다고 가정한다.
텍스트 파일은 text.txt로 아래와 같이 구성하여 저장하자.

조건1) fgets함수를 사용하지 말 것
조건2) argc를 이용하여 에러 메시지를 띄울 것
조건3) 파일 종결 에러 메시지를 띄울 것

 

[실행결과]

실행파일의 이름이 wordcnt.exe이고 대상파일의 이름이 text.txt인 경우 아래와 같다.

 

[수정할 코드]

#include <stdio.h>

int main(int argc, char* argv[])
{
	FILE* fp;
	char str[30];
	int a_cnt = 0;
	int p_cnt = 0;

	if (argc != 2) {
		printf("usage error!\n");
		return -1;
	}

	fp = fopen("file.txt", "rt");

	if (fp == NULL) {
		printf("file open error");
		return -1;
	}

	while (1) {
		if (fscanf(fp, "%s", str) == EOF)	break;
		if (str[0] == 'a' || str[0] == 'A')	a_cnt++;
		if (str[0] == 'p' || str[0] == 'P')	p_cnt++;
	}

	if (feof(fp) == 0)	printf("file close fail\n");
	else
	{
		printf("file close success\n");
		printf("A(a) 시작 단어 수: %d\n", a_cnt);
		printf("P(p) 시작 단어 수: %d\n", p_cnt);
	}


	fclose(fp);
	
	return 0;
}

 

[코드]

#include <stdio.h>

int main(int argc, char* argv[])
{
	int numA = 0, numP = 0;
	char word[50];   //세상에서 가장 긴 단어가 45글자.
	FILE* file;
	int state;

	if (argc != 2)
	{
		printf("usage : word test.txt \n");
		return 1;
	}

	file = fopen(argv[1], "rt");
	if (file == NULL)
	{
		printf("file open error! \n");
		return 1;
	}

	while (1)
	{
		fscanf(file, "%s", word);
		if (feof(file) != 0)
			break;

		if (word[0] == 'A' || word[0] == 'a')
			numA++;

		if (word[0] == 'P' || word[0] == 'p')
			numP++;
	}

	printf("A(a) 시작 단어 수 : %d \n", numA);
	printf("P(p) 시작 단어 수 : %d \n", numP);

	/* 파일의 종결 */
	state = fclose(file);
	if (state != 0)
	{
		printf("file close error! \n");
		return 1;
	}
	return 0;
}

 

<참고>

윤성우의 열혈 C 프로그래밍

fscanf 함수의 에러로 while문을 빠져나오는 로직이 잘못되었다.

'프로그래밍 언어 문제 > C' 카테고리의 다른 글

[C언어] 연습문제1  (0) 2022.05.07
[C언어] 연습문제3  (0) 2022.05.05
[C언어] 연습문제4  (0) 2022.05.05
[C언어] 연습문제5  (0) 2022.04.20
[C언어] 연습문제6  (0) 2022.04.16