[C] 문자열 파싱할때 질문점 드릴게용
문자열 형태가
1 test1 this is first test
2 test2 this is second test
3 test3 this is third test
이런형태의 문자열이 있는데요
부분별로 구별해보면
"숫자" + "공백" + "이름" + "공백" + "값"
1 test1 this is first test
2 test2 this is second test
3 test3 this is third test
이런식으로 구성된 문자열들이있는데 파일이 있는데
이파일을 읽어들여 파싱하려 합니다
맨처음에 숫자로 되있는 부분을 어떤식으로 파싱하면 좋을까요?
저 문자열 하나를 buffer 에 담고
atoi(buffer) 해버리면 나오긴하는데
사용자 실수로 앞에 번호가 지워질수도있는거고
공백이 들어갈수도있고 다른문자가 들어갈수도있고...
buffer 에 고대로 문자열 다 담고 atoi(buffer) 하는건 안좋은 방법이겠죠?
만약 안좋지않은 방법이고 예외처리만 잘 된다면 상관없다면
숫자가 아닌 값들은 0으로 리턴되기때문에 숫자 범위를 1부터 999까지 주고
예외처리를 할까요?
아니면 저 방법이 잘못됬다면
임시변수에 첫번째 공백 전의 문자열 (숫자부분) 을 복사해서 atoi(임시변수) 가
솔직히 가장 안전한 방법이라는 생각은 들긴하는데...
그럴라면 변수 하나더에 첫번째 공백 전까지만 복사해야되서
strncpy(임시변수, buffer, (int)strchr(buffer, ' ') - (int)buffer));
머 이런식으로 해야될까요?
이상 초보개발자 질문올려보아요 ㅎ
"숫자" + "공백" + "이름" + "공백" +
"숫자" + "공백" + "이름" + "공백" + "값"
이 형식이 고정된 상태라고 한다면
다양한 방법이 있겠지만. 저라면
sscanf(buffer, "%d %s %s", number, name, value);
로 처리 후에 잘못된 것에 대해서는 예외 처리하도록 하겠습니다.
더 좋은 방법은 다음분께서~~~~
일단 문자열에 넣고보자는 거군요 근데 만약 값
일단 문자열에 넣고보자는 거군요
근데 만약 값 부분에 \0 가 들어가있다면
넣으면서 세그에러가 떠서 안되겠네요 ㅋ
사용법과 에러체크가 조금 귀찮긴 하지만 문자열을
사용법과 에러체크가 조금 귀찮긴 하지만 문자열을 정수로 변환시 atoi보다 strtol, strtoul, strtoll, strtoull등의 함수들을 사용하는 것이 좋습니다.
변환에 성공해서 0이 리턴되는 경우에도 사용할 수 있습니다.
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
감사합니다 안전한 함수사용은 몇번을 강조해도 지나침이
감사합니다
안전한 함수사용은 몇번을 강조해도 지나침이 없겠죠 ㅎ
제가 쓰는 방법이긴한데... char
제가 쓰는 방법이긴한데...
char *test;
test = strtok(buffer, " ");
공백으로 끊어서 읽어오는 방법입니다.
두번째 문자를 파싱할때는
test = strtok(NULL, " ");
하시면되요
strtok 은 끊긴 뒷부분을 제가 사용할수없어서
strtok 은 끊긴 뒷부분을 제가 사용할수없어서 안써서요 ㅋ
작업을 두 개 하시면 어떨지요?
처리하려는 파일에서 예외가 발생할 가능성이 크다면,
차라리 파일을 어떤 기준으로 정리하는 프로그램을 만들고
이 정리된 파일을 파싱하는 프로그램을 따로 만드는 방식이요.
예를 들어 이런 파일을 처리해야 한다고 하면,
1 test1 TestValue1
2\ttest2\tTestValue2
test3 TestValue3
아래와 같은 식으로 먼저 형식을 맞춰주고,
1 test1 TestValue1
2 test2 TestValue2
-1 test3 TestValue3
이 형식으로 저장된 파일을 파싱하면 된다는 것이지요.
제 생각은 이렇습니다.
저는 이렇게 생각했습니다.
음 그것도 방법인데 문자안에 '/' 이런게 들어갈
음
그것도 방법인데
문자안에 '/' 이런게 들어갈 수가 있어서 ...
지금 데이터를 보니
총 세부분중에 (맨처음 숫자, 가운데 이름, 끝 값)
첫부분인 숫자, 두번째부분인 이름에는 공백이 절대 들어갈수가없어서
공백으로 끊고 마지막 값 부분엔 값안에 공백들이 들어갈수가있고
전체적인 문자열에서 절대 생길수없는 값을 찾아서 그걸 델리미터로 사용하고싶었으나
그걸찾지 못하겠네요 ㅋ
설령 그걸찾아도 나중에 그 문자가 사용될 룰이 추가될지도모르는거고..
그런 건 사용자가 주의해서 쓰게 하는 방법 밖엔 없는
그런 건 사용자가 주의해서 쓰게 하는 방법 밖엔 없는 것 같습니다.
예를 들면 문자열을 사용자가 입력했을 때, 사용하면 안 되는 문자 집합 모음으로
char *deniedChar; 같은 배열을 선언하고
입력받은 문자열 안에서 금지된 문자가 있다면 파일에 넣기 전에 빼내는 방식으로요.
게임 아이디같은 경우도 "특수 문자나 공백은 불가능합니다"같은 메시지가 뜨기도 하니까 말입니다.
그리고 솔직히, 그 문자가 사용될 룰이 나중에 추가된다 해도 그건 나중 일이라고 생각합니다.
그 때 되면 새롭게 고민할 일이고 지금 미리 고민하는 건 기우 같아요.
저는 이렇게 생각했습니다.
일단 본문에 질문한 대로 첫번째로 나오는 숫자가
일단 본문에 질문한 대로 첫번째로 나오는 숫자가 문제라면, 정규표현식으로 꺼내면 됩니다.
그런데 중간에 보니 질문이 확장되어있네요...
말씀하신대로 중간에 규칙이 추가되는 일이 있다면, 그건 절대로 자동화 못합니다. rbfwmqwntm 님 말씀대로 추가되서 에러가 난 다음에 고쳐야겠죠.
전체를 한번에 커버할 수 있는 규칙을 고민하기보다, 90%정도를 만족시키는 규칙을 만들고, 나머지 10%에 대해 적당히 예외처리를 하도록 하는게 좋겠습니다.
피할 수 있을때 즐겨라! http://melotopia.net/b
댓글 달기