★피터팬★
접속 : 2598   Lv. 52

Category

Profile

Counter

  • 오늘 : 82 명
  • 전체 : 178687 명
  • Mypi Ver. 0.3.1 β
[잡담] c언어 할 줄 아시는 분 (11) 2012/11/24 AM 02:20
#include
#include
#include

int main(void)
{

FILE *fp = fopen("word.txt", "r");
char *words_p[100];
int words_n[100];
int words_number=0;
char* s;
int i;

while(fscanf(fp,"%[^ \t\n.,!?:]%*c", s)!=EOF)
{
for(i=0; i {
if(strcmp(s,words_p[i])==0)
{
words_n[i]++;
break;
}
}
if(i==words_number)
{
words_p[words_number]=(char*)calloc(strlen(s)+1, sizeof(char));
strcpy(words_p[words_number],s);
words_number++;
}

}
fclose(fp);
return 0;
}


뭐가 잘못됐는지 자꾸 실행이 안되네요,,

신고

 

루리순돌    친구신청

char * words_p[100] 은 char words_p[100] 을 쓰려고 했던 거겠죠?

루리순돌    친구신청

그런데 char* s 는 할당 해주지 않고 쓰고 있어서 런타임에러가 날거 같아요

JiEun,    친구신청

ㄴ무슨말인지 잘ㅜ

루리순돌    친구신청

제 첫번째 답변은 일단 무시해버리시고!
두번째 글처럼 s 는 char* 캐릭터 포인터 형으로 생성되었는데,
크기 할당이 안된채로 사용되고 있어요~
그래서 fscanf 에서 접근하려다가 죽는거에요.

매냑군    친구신청

포인터는 선언과 동시에 할당을 하던지
아니면 NULL 을 가르키게 하던지
정 모르시겠으면 while 시작 부분에 브레이크 포인트 (F9) 걸고
한줄 한줄(F10) 각각의 변수에 어떤값이 들어있는지 체크해보세요
디버깅 능력이 중요합니다

루리웹-198137259    친구신청

s를 계속 포인터형 편수로 쓰겠다면
s = (char*) malloc( 100 );
이런 식으로 메모리 공간을 할당하시던가,
아니면 char *s를 char s[100]으로로 선언하세요.

포인터 변수가 가리키는 주소에 기억 장소가 할당되어 있지 않을때
프로그램이 오류가 납니다. 100%

편안한 집    친구신청

%*c에 문제가 있는 줄 알았더니 그냥 파일 맞춰주는 용이었네요...
그냥 s에 메모리가 할당 안되어 있는 문제가 맞는 것 같습니다.
char s[100]; 같은 걸로 바꾸세요.

char *word_p[100]도 char word_p[100]가 되야 할 것 같고요...

루리웹-198137259    친구신청

이 소스의 모양새를 보아 하니... word.txt 내에 있는
각각의 단어의 개수를 세어보는 소스인것 같은데...
이 소스는 s에 메모리가 할당되어도 단 한번의 반복문도 일어나지 않으니
로직을 완전 다시 세우시기 바랍니다.

Mindflow    친구신청

예제를 그대로 써도 컴파일러가 다르다면 에러가 나는 경우가 많습니다.
보통 컴파일러가 에러난 부분을 교정해서 컴파일해주는 경우가 있는 반면,
자비없이 에러로 내쳐버리는 경우도 있거든요.
배열포인터 뿐만 아니고, 레지스터에 할당되는 데이터 크기부분도
윈도우쪽 비쥬얼C 컴파일러는 자기 임의대로 만들어서 컴파일해주지만
gcc는 칼같이 에러로 내쳐버립니다.
그리고 gcc처럼 에러로 내쳐버리는 것이 메모리 누수라던지 심각한 에러를 막는 가장 좋은 방법이기도 합니다.

촐랑    친구신청

words_number=0 인데 for(i=0; i<words_number; i++) 하니 루프가 끝나버리네요

oilugi    친구신청

for 문이 문제네요
i=0; 인데 0<0 ; i++ 이 되니.. 돌아갈리가 없죠
X