2013-02-14 5 views
6

나는 scanf에서 정규 표현식을 사용하여 최대 n 자 문자열을 읽고 새 줄 문자까지 다른 것을 버리려고했습니다. 모든 공백은 일반 문자로 처리되어야하므로 읽을 문자열에 포함됩니다. 정규식에 관한 Wikipedia 기사를 읽었지만 scanf가 제대로 작동하지 않습니다. 여기에 내가 시도한 몇 가지 코드 :정규 표현식으로 scanf 사용

scanf("[ ]*%ns[ ]*[\n]", string); 

[] 실제 공백 문자에 갈 예정이다, *는 하나 또는 그 이상을 의미하는데, n은 문자의 수를 읽는 것입니다 및 문자열에 대한 포인터이다 malloc으로 할당된다. 여러 가지 조합을 시도했습니다. 그러나 나는 문장의 첫 단어 만 읽는 경향이있다 (공백 문자에서 멈춘다). 게다가 *는 "0 이상"을 의미하는 대신 문자를 버리는 것 같습니다 ...

정규 표현식이 scanf에 의해 어떻게 해석되는지 자세히 설명 할 수 있습니까? 게다가 getc를 반복적으로 사용하는 것이 효율적입니까? 사전에

감사합니다 : D

+2

'fgets()'시도 :'fgets (string, sizeof string, stdin); ' – pmg

+0

남은 문자가 입력 스트림에 남게되는 문제는 그렇지 않습니까? – someone

+0

공간이 충분한 경우'fgets()'는'\ n '까지 모든 것을 소비합니다. – pmg

답변

4

짧은 대답 : scanf 말 그대로 말하기 정규 표현식을 처리하지 않습니다.

C에서 정규 표현식을 사용하려면 regex POSIX 라이브러리를 사용할 수 있습니다. 이 라이브러리 사용에 대한 기본적인 예를 들어 다음과 같은 질문을 참조하십시오 : Regular expressions in C: examples?

을 지금 당신은 그것을 당신의 최대 수에 의해 %nsn를 교체

scanf("%*[ ]%ns%*[ ]\n",str); 

뭔가를 시도 할 수있는 scanf 방법을 수행하려는 경우 입력 스트림에서 읽을 문자 %*[ ] 부분은 공백을 무시하도록 요청합니다. 정확한 숫자를 무시하기 위해 *을 특정 숫자로 바꿀 수 있습니다. 중괄호 사이에 다른 문자를 추가하여 공백 이외의 다른 문자를 무시할 수 있습니다.

위의 scanf가 공백으로 작동하는지 확실하지 않은 경우 %s 지시문과 일치하는지 확인하십시오. How do I trim leading/trailing whitespace in a standard way?

+0

결국, 다른 모든 방법을 버릴 수 없습니다. 나머지 입력? getc를 반복적으로 사용하여 필요한 문자 수를 유지하고 \ n 문자가 발견 될 때까지 문자열의 나머지 부분을 버리는 것에 대해 생각했습니다. – someone

+0

귀하의 의견을 게시 할 때 내 대답을 편집했습니다. 그래서 네, 일부 입력을 무시할 수 있지만 scanf 형식 문자열을 "정규식"이라고하지는 않습니다. – greydet

+0

답변 해 주셔서 감사합니다. 그러나 거기에서 사용한 것에 대한 의미를 설명 할 수 있습니까? – someone

2

는 getc로 반복적으로 대신 사용하는 것이 효율적입니다 :
나는 확실히 다음과 같이 함께 주변의 공백을 triming하는 fgets 호출로 갈 것?

는 용도에 다소 의존하지만 YESgetc() 효율적이고 반복했다.

0

질문을 잘못 읽지 않는 한 % [^ '\ n'] s는 캐리지 리턴이 발생할 때까지 모든 것을 저장합니다.

+1

'% [^ '\ n'] s'에있는's'는 필요하지 않습니다. – chux

관련 문제