2015-01-27 4 views
1

저는 C에서 약간 녹슬 었습니다. 나는 사용자 입력을받는 프로그램을 만들 것을 요구하는 학교 과제를했습니다. 문자 수가 50보다 크면 아무 것도 출력하지 않고 다시 설정하십시오. 종료하면 수를 인쇄해서는 안됩니다 (이 경우 4).C : 특정 입력이 삽입 될 때까지 문자 수를 계산하십시오.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ /*Start of main*/ 

printf("Type any word you'd like <= 50 characters.\nType quit to exit:\n"); 

char word[50]; 
int wordLength = 0; 

    while (strcmp(word, "quit") != 0) 
    {/*open of while loop (strcmp ... != 0)*/ 

    scanf("%s\n", word); 
    wordLength = strlen(word); 
    if (wordLength > 50) 
     { 
      printf("Try again, >= 50 characters!:\n"); 
      scanf("%s", word); 
      wordLength = strlen(word); 
     } 
    printf("%d\n", wordLength); 

    }/*End of while loop (strcmp... != 0)*/ 

return 0; 
}/*End of main*/ 

나는 즉시 제출 단어 다음 길이를 얻이 수없는 것 :

이것은 내가 지금까지있는 것입니다. 그것은 어색한 얻을 것 같습니다. 새 단어를 입력 한 후 마지막 제출 된 단어의 번호를 표시합니다. printf를 어디에 두어도 상관 없습니다. 시간이 걸립니다.

누군가가 내게 왜 그렇게 느린 지 설명 할 수 있고, 더 빨리 구현할 수있는 방법을 제안 할 수 있습니까? 이것은 학교 임무이며, 직접적인 답변을 공유하지 말고, 내가 생각해야하는 방식으로 안내해주십시오. :)

저는 이것이 지연으로 비효율적 인 코딩이라고 생각하고 있습니다.

당신은 모두 생명의 은인입니다! 안 하나 당신이 줄 바꿈을 보려면 여기를 를 기대 -

+0

[C-FAQ 12.17 (http://c-faq.com/stdio/scanfhang.html) –

+0

어레이 '숯 워드 [50] 코드가 수행하는 첫 번째 작업은 처음 4 바이트를 비교하므로 초기화해야합니다. 제안 : 'char word [50] = {'\ 0 '}. 그러나 50 바이트의 입력을 허용하려면 문자열 종료 바이트 ' – user3629249

+0

의 단어 길이가 50을 초과 할 수 없도록하려면 char 단어 [50]이 char word [51]'여야합니다. 단어 [] 배열이 오버런되지 않은 경우 이는 정의되지 않은 동작이며 seg fault 이벤트로 이어질 수 있습니다. – user3629249

답변

5

\nscanf()에서 다른 의미를 가지고, @remyable 먼저 scanf()

scanf("%s\n", word); 
#---------^ 

감사에서 \n를 제거합니다. 참조 C-faq 12.17

또한 50 개 이상의 문자가 올바르지 않은지 확인하십시오. 버퍼 오버런이 발생합니다. 그것을 제한하는 다른 방법을 찾으십시오. word

  • strlen 수에 를 작성 얻을 문자의 수를 제한하지 않습니다 word 전에 word
  • scanf를 초기화 사용

  • +0

    공백을 만났을 때 scanf의 동작 (예 :, newline)은 다음과 같습니다. "공백 문자로 구성된 지시문은 공백이 아닌 첫 번째 문자 (읽지 않은 채로)까지 입력을 읽거나 더 이상 문자를 읽을 수 없을 때까지 실행됩니다. 지침은 결코 실패하지 않습니다. " (§7.21.6.2/5) –

    +0

    로한과 remyabel 감사합니다! :) ** ** \ n **에 대한 설명에 감사드립니다! – HowbeitGirl

    1

    코드는 여러 문제

    • while 문이있는 경우에만 버퍼 오버런이있는 경우 숫자 >50을 반환하십시오.
    • 코드 만 다시 작성하십시오. 사용자가이를 때까지 한 번 프롬프트가 다시 메시지해야 오른쪽
    관련 문제