>

관련 코드 스 니펫 :

char input [1024];
printf("Enter text. Press enter on blank line to exit.\n");
scanf("%[^\n]", input);

사용자가 [enter]를 누를 때까지 전체 줄을 읽으며, 사용자가 원하는 경우 두 번째 줄을 입력하지 못하게합니다.

종료하려면 [enter]를 누른 다음 [enter]를 다시 누르십시오. 그래서 모든 종류의 while 루프, for 루프 및 새로운 줄 이스케이프 시퀀스와 관련된 scanf () 주위의 if 문을 시도했지만 아무것도 작동하지 않는 것 같습니다.

어떤 아이디어?


  • 답변 # 1

    이것을 시도하십시오 :

    while (1 == scanf("%[^\n]%*c", input)) { /* process input */ }
    
    

  • 답변 # 2

    아직 지적했듯이 fgets()   scanf() 보다 여기가 낫다 .

    fgets(input, 1024, stdin); 로 전체 줄을 읽을 수 있습니다
    어디 stdin  표준 입력(키보드)과 연결된 파일입니다.
    fgets() 기능  키보드에서 첫 번째 줄 바꿈 문자까지 모든 문자를 읽습니다 : '\ n'(물론ENTER키를 눌렀을 때 얻을 수 있습니다 ...).
    중요 :문자 '\ n'은입력배열의 일부입니다.

    이제 다음 단계는 배열의 모든 문자가입력,
    첫 번째부터 '\ n'까지는 공백입니다.
    또한입력에서 첫 번째 '\ n'뒤의 모든 문자는 쓰레기이므로 확인하지 않아도됩니다.

    귀하의 프로그램은 다음과 같습니다.

    char input[1024];
    printf("Enter text. Press enter on blank line to exit.\n");
    while (1) {
       if (fgets(input, 1024, stdin) == NULL)
         printf("Input Error...\n");
       else {
         /* Here we suppose the fgets() has reached a '\n' character... */
         for (char* s = input; (*s != '\n') && isspace(*s); s++)
            ; /* skipping blanks */
         if (*s == '\n')
            break; /* Blank line */
         else
            printf("%s\n", input); /* The input was not a blank line */
       }
    }
    
    

    이 코드는 main() 안에 작성해야합니다  차단 및
    더 중요한 것은 헤더 <ctype.h> 를 포함해야합니다.  우선,
    isspace() 때문에  기능이 사용됩니다.
    코드는 간단합니다 :영원히실행되는 동안 사용자는 각 반복에 한 줄을 입력하면if문장은 오류가 있는지 확인합니다 일어났다.
    모든 것이 정상이면for (;;)문이 실행되어입력배열을 탐색하여 공백이 있는지 확인합니다.
    for반복은 첫 번째 줄 바꿈 '\ n'까지 계속되거나 비어 있지 않은 문자가 나타납니다.
    for가 종료되면 이는 마지막으로 분석 된 문자 ( *s 에 있음)를 의미합니다

    input []에 공백이 아닌 문자가 있음을 의미하므로input은 일반 텍스트).

    와이즈 비즈 와이즈 비즈  빈 줄이있는 경우에만 중단됩니다.   읽다 (

    The "ethernal" 참조)  11 번째 줄의 문구).

  • 답변 # 3

    OP에서 "종료하려면 [enter]을 (를) 누른 다음 [enter]]를 다시 누르십시오"

    while(1)
    
    

  • 답변 # 4

    break
    
    

  • 답변 # 5

    unsigned ConsecutiveEnterCount = 0; for (;;) { char buffer[1024]; if (fgets(buffer, sizeof(buffer), stdin) == NULL) { break; // handle error or EOF } if (buffer[0] == '\n') { ConsecutiveEnterCount++; if (ConsecutiveEnterCount >= 2 /* or 1, not clear on OP intent */) { break; } } else ConsecutiveEnterCount = 0; // Do stuff with buffer; }

    읽기전에 시도하지 말아야 할 모든 것을 시도한 것 같습니다!AC 프로그래머는설명서를 읽거나예상하지 못한정의되지 않은 동작을 실행하여 사용자와 같은 두통을 유발하지 않도록합니다. 경험했습니다. 좀 더 정교하게 말하면 자바처럼추측하여 C를 배울 수 없습니다.

    이 교훈을 고려하십시오.추측을 중지하고읽기시작 ( #include <stdio.h> int main(){ char arr[40]; int i; for( i = 0; i < sizeof(arr); i +=2 ){ scanf("%c%c",&arr[i],&arr[i+1]); if( arr[i] == '\n' && arr[i+1] == '\n' ) break; } printf("%s", arr); return 0; } )  수동)!

    해당 매뉴얼에 따르면 :

    와이즈 비즈 와이즈 비즈  예상 바이트 세트 (스캔 세트)에서빈 없음바이트 시퀀스와 일치합니다.

    중점은 나의 것이다.바이트 시퀀스는일치실패를 의미합니다. 설명서에서일치하는 실패에 대해 무엇을 말합니까?

    와이즈 비즈

    다시 강조하자면 ... 이것은 대부분의 다른 C 표준 함수와 마찬가지로반환 값을 확인해야합니다!

    ... I tried all sorts of while loops, for loops, and if statements around the scanf() involving the new line escape sequence but nothing seems to work.

    에 전화 할 때  그런 다음 fscanf 의 선을 따라 관용구를 작성하십시오. .

    오류 처리는 어디에 있습니까?반환 값은 단순한이진 선택이 아닙니다. 어디

     변환이 수행되고, [ 가 있습니다  

    Upon successful completion,these functions shall return the number of successfully matchedand assigned input items;this number can be zero in the event of an early matching failure. If the input ends before the first conversion (if any) has completed, and without a matching failure having occurred, EOF shall be returned. If an error occurs before the first conversion (if any) has completed, and without a matching failure having occurred, EOF shall be returned...

    범위의 가능한 리턴 값 fopen . if (fp == NULL) { /* handle error */ } 를 사용하려고 시도하기 전에 각각의 의미를 이해해야합니다. .

    n

관련 자료

  • 이전 javascript - 내가 만든 API에서 데이터를 가져 오는 HTML 페이지에 데이터를 동적으로 표시
  • 다음 numerical - 문자열을 숫자로 변환하는 Javascript?