프로그래밍

C린이 질문해도 됩니까 형님들

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct Data {
    char A[10];
    char B[10];
    int C;
};

int main()
{
    struct Data D[3];
    int i;
    FILE *fp = fopen("test.txt", "r");

    for (i = 0; i < 3; i++)
    {
        fscanf(fp, "%s,%s,%d\n", &D[i].A, &D[i].B, &D[i].C);  /구조체 배열로다가 test에서 ,로 단어가 구분되어있어서 그걸 구조체 멤버에 넣고싶어요/
    }

    fclose(fp);

    printf("%s", &D[0].A); / fscanf로 구조체 멤버에 제대로 구분돼서 들어갔는지 확인하려고 넣었습니다. 그런데 D[0]의 A에 '김밥,김치,1'이 들어가요/

    return 0;
}

-------------------------------------------------------------------------------------------

test.txt 파일 내용

넙치,김치,1

참치,꽁치,2

갈치,쥐치,3

------------------------------------------------------------------------------------------

 

일단 코드를 적었는데 C언어 거의 초보수준인데 3년만에 갑자기 만지게 된거라 

멍청한 질문일 수도 있습니다 이제 막 배우는 입장이니 너그럽게 봐주세요;

 

fscanf 가 서식을 지정해서 파일을 읽어 구조체에 쓸 수 있다고 알고있는데 "%s,%s,%d" 로 서식지정해주면 D[0]에서 넙치를 A에 김치를 B에 1을 C에 입력하는줄 알고 있었는데, 구조체 전부를 출력하면 계속 이상한 값이 나와서 printf를 사용해서 D[0]의 A에 '넙치,김치,1' 이 전부 들어갑니다.

최종적으로는 쉼표로 구분된 단어를 구조체 멤버에 하나씩 넣어주고 마지막에 쉼표가 아닌 띄어쓰기로 구분해서 전부 출력하고 싶은데

혼자서 하기엔 어려움이 있네요

잘못된 부분과 추가해야 될 부분이 있으면 지적바랍니다.

13개의 댓글

2019.03.11

c에도 split 있낭?

0
2019.03.11
@슈슈파다

split 을 써본 적이 없어서 검색해보니까 문자열 분리함수라고 strtok 라는 함수가 있다는데

한 번 찾아봐야겠네요 ㅎ

0
2019.03.11

보통 이런거 할때 가장 좋은방법은 일단 한줄 다 읽고 정규표현식으로 파싱하는 거긴 한데... c 표준 라이브러리에 정규표현식 없어서 dependency 추가해야함 ㅋㅋㅋㅋㅋ

다른방법으로는 %s 대신 %[^,]를 써서 ,를 읽지 못하게 하는 방법도 있음.

님 경우에 해당되는 건 아니지만 이 방법을 쓰면 ,에서만 멈추게 되는거라 new line까지 다 읽으니 주의.

0
2019.03.11
@decltype

%s 가 문자열의 값이 들어가는것이라고 이해하고있는데 %[^,]는 %s에서 ,를 제외하고 읽는다고 이해하면 될까요?

0
2019.03.11
@곧나감

아뇨 그게 쵸큼 복잡한데... 일단 http://www.cplusplus.com/reference/cstdio/scanf/ 이걸 보면서 이야기를 합시다

%s는 정확히 말해서 '공백문자가 아닌 문자들을 문자열로 전부 읽어들여라'라는 뜻입니다. 여기서 공백문자든 뉴라인, 스페이스바, 탭문자 등이에요.

그런데 %[^,]는 '콤마가 아닌 문자들을 문자열로 전부 읽어들여라'라는 뜻이라서, 공백문자도 읽어들이지만 콤마에서만 멈추는 겁니다.

%s == %[^\n\t ] 라고도 할수 있겠네요. 유니코드 공백문자까지 생각하면 더 복잡해지지만...

0
2019.03.11
@decltype

아 %s가 공백문자가 아닌 문자들을 문자열로 읽어들이라는 의미라고 생각하니까 이해가 되네요!

그럼 본문의 코드에서 fscanf에 "%s,%s,%d"를 쓴 부분의 첫 번째 %s가 문자열을 한 줄을 전부 읽어버려서 D[0]A에 test.txt의 첫 줄이 읽혔다 라고 생각되는데 맞나요?

0
2019.03.11
@곧나감

링크 주신 사이트는 영어가 난무해서 어렵네요;;

0
2019.03.11
@곧나감

그렇죠 첫번째 %s가 콤마에서 안멈추고 다 읽어버린게 문젭니다

0
2019.03.11
@decltype

질문 올려보길 잘했네요 뭐가 문제였는지 알았으니 말씀해주신 %[^,]로 필요한 부분은 만들어 낼 수 있을 것 같습니다.

늦은시간에 답변감사합니다!

0
2019.03.12
@decltype

ㄴㄴ fscanf 자체에서 regex를 지원함

0
2019.03.12
@잉텔

regex 비스무리한거지 진짜 regex는 아니여... "%[...]" 문법이 regex 비슷하긴 한데 정확히는 regex의 /[...]+/ 랑 똑같은거고 그나마도 character class만 지원하지 그 이상으로는 지원도 안함

0
2019.03.12
@decltype

그러긴 해도 그정도면 위 문제 해결가능 할것 같은데..

 

0
2019.03.12
@잉텔

그래서 scanf로 해결하는 법 가르쳐 줬자너 %s 대신에 %[^,] 쓰라고

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180540 [잡담] 이제 좀 내 783D좀 내놨으면 좋겠다 익명36 0 1 시간 전 49
180539 [컴퓨터] 저사양게임용 pc견적 이륙해도됨?? 1 푸피벗홀 0 1 시간 전 60
180538 [잡담] 가전은 lg 라던데 5 dlatnaks 0 2 시간 전 80
180537 [컴퓨터] 13900k 전력제한 240w로 쓰면 되냐? 9 ravvit 0 3 시간 전 71
180536 [컴퓨터] 컴사고 할게없다 3 판판야 0 3 시간 전 91
180535 [견적] 게임용 컴 견적 조언좀 부탁 8 우르선갈비찜 0 4 시간 전 89
180534 [모바일] 문외한인데 이정도 스펙이면 폰겜 잘 돌아갈까?? 16 삽살개 0 5 시간 전 122
180533 [견적] 50만원대 괜찮은 컴퓨터본체 추천좀 3 누지 0 6 시간 전 93
180532 [컴퓨터] i9 13900k 쓰고 있는데 철권 데모 끝까지 깼는데도 안튕기면 8 ravvit 0 6 시간 전 142
180531 [컴퓨터] 견적 뽑아봤는데 10 과연너의선택은무... 0 7 시간 전 118
180530 [잡담] 지금 애플워치6 사는건 어때? 4 EvenMoham 0 7 시간 전 113
180529 [잡담] 전자제품 전문 커뮤니티같은거없음? 2 인상펴라 0 8 시간 전 97
180528 [잡담] 컴퓨터 책상 추천좀요 6 하이웨이 0 8 시간 전 89
180527 [정보] 이번 인텔 13,14세대 CPU사태에 대한 공식입장 7 UBCS 3 10 시간 전 384
180526 [정보] G마켓에서 검색을 하면 검색이 안되고 그냥 메인페이지가 새... 5 r33156 0 10 시간 전 76
180525 [컴퓨터] 메인보드에 맞는 그래픽 카드 좀 추천해줘 12 갠챠나 0 11 시간 전 149
180524 [잡담] 개드립접속시 css 차단인가 광고차단 풀라고 하는데 8 스시오 0 12 시간 전 109
180523 [컴퓨터] 님들 모니터암 이거 호환 될거같음? 8 저는기어다닐거에요 0 12 시간 전 125
180522 [잡담] 리얼포스 45g 10만원에 파는데 5 짬지 0 13 시간 전 200
180521 [모바일] 내 s20+ 망가짐 8 모코하와이 0 14 시간 전 210