문제

다음과 같이 분리 된 구매 쉼표 인 표준 입력의 항목 목록을 기대한다고 가정 해 봅시다.

 item1, item2, item3,...,itemn

또한 사용자가 항목과 쉼표 사이의 흰색 공간을 방출하도록 허용하므로 이러한 종류의 입력은 내 프로그램에서 합법적입니다.

item1,item2,item3,...,itemn

내가 사용하는 경우 scanf 이와 같이:

scanf("%s,%s,%s,%s,...,%s", s1, s2, s3, s4,...,sn);

흰색 공간이 없을 때는 실패합니다 (테스트 됨) 전체 입력을 하나의 문자열로 지칭하기 때문입니다. 그렇다면 C 표준 라이브러리 기능으로만이 문제를 어떻게 해결할 수 있습니까?

도움이 되었습니까?

해결책

당신은 볼 수 있습니다 strtok. 먼저 라인을 버퍼로 읽은 다음 토큰 화를합니다.

const int BUFFERSIZE = 32768;
char buffer[BUFFERSIZE];
fgets(buffer, sizeof(buffer), stdin);

const char* delimiters = " ,\n";
char* p = strtok(buffer, delimiters);
while (p != NULL)
{
  printf("%s\n", pch);
  p = strtok(NULL, delimiters);
}

그러나 strtok 당신은 그것을 알고 있어야합니다 재창조와 관련된 잠재적 문제.

다른 팁

빠른 답변은 결코 Scanf를 사용하여 사용자 입력을 읽지 않습니다. 파일에서 엄격하게 포맷 된 입력을 읽기위한 것이며 심지어별로 좋지는 않습니다. 적어도 전체 줄을 읽은 다음 sscanf ()로 구문 분석해야하므로 오류를 수정할 수 있습니다. 기껏해야 자신의 구문 분석 기능을 작성해야합니다.

실제로 C ++를 사용하는 경우 훨씬 더 강력하고 안전한 C ++ 문자열 및 스트림 클래스의 사용을 조사하십시오.

나는 이것을 위해 자신의 구문 분석 기능을 작성하는 것이 낫다고 생각합니다. 그러나 함정에도 불구하고 여전히 scanf를 선호한다면, 당신은 약간의 해결 방법을 수행 할 수 있습니다. %s를 %[^, t r n]로 대체 할 수 있습니다.

비율이 화이트 스페이스 캐릭터의 시퀀스와 일치하는 문제는 쉼표도 삼킨다. 따라서 %s를 %[^, t r n]로 바꾸면 거의 동일하게 작동합니다 (차이는 %s가 공간 문자와 일치하기 위해 ISSPACE (3)를 사용하지만이 경우 어떤 공간 문자를 명시 적으로 지정합니다. 일치 하고이 목록은 아마도 ISSPACE와 동일하지 않을 것입니다).

쉼표 전후에 공백을 허용하려면 형식 문자열에 공백을 추가해야합니다. 형식 문자열 " %[^, t r n], %[^, t r n] "Hello, World", "Hello, World", "Hello, World"와 같은 문자열과 일치합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top