2012-03-08 2 views
1

은 (항상 더 많은 사용자에 의해 입력되는 1 이상 및 10 이하의 값 가정) \ n 인 scanf와 % d 개의 루프를 중단하는 방법 :I은 ​​다음과 2 차원 배열로 공간에 의해 분리 정수를 입력하고

for (i = 0; i < rows; ++i) 
    { 
     while (scanf("%d", &arr[i][j++]) == 1) 
      ++j; 
    } 

난에 값의 진입을 중지 할 [I] [J] I 새로운 줄을 시작에 값을 할당하기 시작할 때 [I + 1] [J] 등 I 입력 것을 좋아한다면 : 그래서

12 54 2 4 
1 2 

다음과 같은 값을 포함하게되었습니다 :

,454,024,783,210

답변

-1

는 AFAIK이 단독 scanf 불가능하면과 상기 버퍼를 통해 (gets 같이 \n에 끝납니다) 임시 버퍼에 판독하고 후속 스캔 할 gets의 조합을 사용해야 scanf과 같은 것이 각 int를 읽습니다.

참고 : Peter 하이라이트로 gets은 프로덕션 용도로 적합하지 않지만 과제를 위해 적합합니다. 충분한 IMO 이상입니다.

실제로 scanf 대신 strtol을 사용하여 읽기 전용 줄에서 정수를 추출하는 것이 좋습니다.

+1

사용자 개입을 위해 gets()를 절대로 사용하지 마십시오. 버퍼 오버플로 - 공격이 가능합니다. –

+2

버퍼 오버런과 관련하여 위협은 코드 작성자가 텍스트를 입력하고 코드를 충돌하는 것보다 더 많이 발생합니다. 위협을 과도하게 각색 할 필요가 없습니다. 악성 프로그램의 대상이 될 가능성이 거의 없으면 충분히 위험합니다. – Clifford

+0

프로덕션 코드에서 사용자 입력에 대해 많은 것을 얻었습니다. 따라서이 기능을 제거하는 것은 제 개인적인 성전입니다. 학생으로서 배우는 것 전체 캐리어를 사용할 수도 있고 그렇지 않을 수도 있습니다. –

1

정직하게 fgets를 사용하는 것이 좋습니다. 결코 scanf를 좋아하지 않았습니다. fgets를 사용하여 줄을 읽은 다음 줄무늬로 나눕니다. fgets의 반복을 사용할 때마다 다음 행에 있어야합니다. 논리를 적절하게 사용하십시오.

0

\ n scanf()와 함께 처리하는 것이 알려져 있지 않습니다. 작동하는 경우, 특정 라이브러리 버전에서는 그렇게 할 수 있지만 결코 이식 할 수는 없습니다. termlib/termcap/curses/ncurses가 사용자 인터랙션에 필요하다면 fgets()를 사용하고 자동 데이터 처리에 필요한 경우 입력을 구문 분석하는 것이 더 좋습니다.

+0

"깨진"것이 아니며, 동작은 * 의도적으로 * 문서화되어 있습니다. scanf()의 경우 공백은 필드 구분 기호이며 개행은 공백으로 분류됩니다. – Clifford

+0

여기서 \\ n은 소비되어야하고 어디에서 소비되지 않는지는 정의되지 않습니다. –

+0

ISO/IEC 9899 : * "공백 문자 ('isspace' 함수에 의해 지정됨)는 지정에 [, c 또는 n 지정자가 포함되어 있지 않으면] 건너 뜁니다. * – Clifford

1

scanf()은 "행 지향적"이 아니며 개행을 다른 공백으로 취급합니다. 필요한 작업을 수행하는 방법은 다양하지만 한 가지 방법은 "행 지향"함수를 사용하여 먼저 행을 얻은 다음 scanf() 대신 sscanf()을 사용하여 해당 행을 단독으로 처리하는 것입니다. 당신이 아니라 무엇을 표준 입력에 오면 항상 유효하다고 가정보다 입력에 필요한 유효성 검사를 수행 할 수 있기 때문에

#define ROW_BUFF_LEN 128 
char row_buffer[ROW_BUFF_LEN] ; 
for (i = 0; i < rows; ++i) 
{ 
    fgets(row_buffer, MAX_ROW_LEN, stdin) ; 
    while(sscanf("%d", &arr[i][j++]) == 1) 
    { 
     ++j; 
    } 
} 

는 일반적으로이 방법은 바람직하다.

참고 TEH 표준 입력 스트림 fgets()의 사용은 후자가 더 버퍼 오버런 방지가없는 것처럼 gets() 선호한다.

관련 문제