프로그래밍

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
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
5655 [프로그래밍] 어떻게 공부하면 될까 4 운빵 0 1 일 전 185
5654 [프로그래밍] 혹시 강의해본애들있어?? 8 억로또당첨자 0 3 일 전 340
5653 [프로그래밍] 옵시디언(노트앱) 사용 후기 10 너가전부옳아 1 4 일 전 242
5652 [프로그래밍] xcode15 년차html개발자 1 4 일 전 143
5651 [프로그래밍] 파이썬 초보인데 스트레스 오지게 받는데 7 부터시작하는이세... 2 5 일 전 427
5650 [프로그래밍] 이런건 무슨언어로 만든건지 짐작가? 16 커피2리터 0 5 일 전 452
5649 [프로그래밍] 패스트캠퍼스 할인 낚시 좀 심하네 3 조강현 0 6 일 전 225
5648 [프로그래밍] Claude 시발 chatgpt 복붙 후 프롬프트만 추가한거 아니냐?? ... 4 닉넴뭐할가 1 7 일 전 270
5647 [프로그래밍] 원격제어 프로그램 만드려는데 강의 추천 좀 9 집에가게해줘 0 8 일 전 228
5646 [프로그래밍] vnc 유료라도 좋으니 좋은거 추천점... 11 아마존새개들끼 0 8 일 전 261
5645 [프로그래밍] 공부 왜함? AI한테 잘 보이면 되는데 2 조강현 1 8 일 전 243
5644 [프로그래밍] 프로그래머 특) 웹서핑할때 사이트 도메인주소 직접침 13 삼각김밥맛있어 0 9 일 전 283
5643 [프로그래밍] RnD 수행계획서 같은거 써본 개붕이 있음? 3 69746974 0 9 일 전 288
5642 [프로그래밍] 형님들 JNI 질문 있어요 [해결] 2 dogdrippy 0 10 일 전 147
5641 [프로그래밍] 혹시 프로그래밍 강의해본사람 있음?? 7 억로또당첨자 0 10 일 전 404
5640 [프로그래밍] 자바 동시성 프로그래밍 공부 분량이 적지 않네 14 찰나생멸 0 10 일 전 319
5639 [프로그래밍] react jest 코드에서 에러가 날 상황 아시는 분? Hime 0 12 일 전 133
5638 [프로그래밍] 요번에 그림 넣으면 자동으로 UI생성해주는 거 질문한 개붕인데 1 케로로중사 0 12 일 전 207
5637 [프로그래밍] 맥쓸때마다 너무 스트레스 받는다 10 정소민 0 12 일 전 344
5636 [프로그래밍] 신입뽑을려고 질문리스트 만들어봄 22 69746974 0 12 일 전 424