2012-12-18 3 views
0

다음 C 코드의 문제점은 무엇입니까? ("선택 ...")cstdio를 사용하여 키보드 입력 읽기

int nfds = 0; 
char c[2] = " "; 
char ans[2] = " "; 

printf("Test p or s [p,s]: p? "); 
ans[0] = (char)getchar(); 
if (ans[0] != '\n') 
    { 
    ans[1] = '\0'; 
    printf("ans = %s\n", ans); 
    } 
else 
    ans[0] = '\0'; 

/* FIXME: answering 's' -> nfds is never read */ 
printf ("Choose [0, 1, 2, 3]: 0? "); 
c[0] = (char)getchar(); 
if (c[0] != '\n') 
    { 
    c[1] = '\0'; 
    nfds = strtol(c, NULL, 10); 
    } 
else 
    c[0] = '\0' 
printf("nfds=%d\n", nfds); 

은 "반환"작품에 대답하지만, 인쇄에서 멈추지 않는다 "S + 수익을"응답 (업데이트) 및 것처럼 계속 "반환"이미 주어졌다?

어쩌면 더 나은 솔루션이 될 것입니다 : 첫째, ans에 문자/문자열을 읽어 기본 : 문자의 "return"/문자열 = 'S'/ "의"정수 nfds에 읽고 다음 질문을, 기본 : "return"

+0

s^D는 응답하지만 s^J는 응답하지 않습니다. (\ n = return) – user1914074

답변

4

첫째 :

c[2] = '\n';

두 가지 요소의 배열에는 c[2] 없습니다. ans과 동일합니다.

둘째 :

c[1] = getchar(); 
... 
nfds = atoi(c); 

배열이 두 가지 요소를 가지고 있으며, 문자열이 null 종료해야합니다. c[1]을 덮어 쓰면 c 배열에 문자열을 저장할 수 없습니다.

EOF와 반환 값을 비교하는 경우이 중요하다, 그 getchar 다시 표시 int 아닌 char도 알고 있어야합니다.

또한 atoi 함수는 오류 검사를 수행 할 수 없으므로 strtol을 사용해야합니다.

+0

물론 C 배열은 0부터 시작합니다. – user1914074

+0

'char ans [2] = ""; '는'c [1]'값이 널 문자임을 의미합니다. 'c [1]'을 덮어 쓰면,'ans'는 더 이상 문자열이 아닙니다. – ouah

1

ouah가 말한 것에 따라 빌드하려면 getchar()은 눌려진 값의 decimal 값이 될 int 값을 반환합니다. 따라서 사용자 키 스트로크를 int로 캡쳐하고 typecast을 char로 가져와 char 배열에 삽입해야합니다. 만약 내가 잘못

int key_stroke; 
char array[size] 

key_stroke = getchar(); 
array[1] = (char)key_stroke; 

저를 수정하지만 당신은 엔터 키를 누를 때까지 키 입력을 처리하는거야? 다음 코드를 사용하면 훨씬 간단하고 명확하게 수행 할 수 있습니다.

int key_stroke; 
char array[size] 

for(i = 0; ((char)key_stroke != '\n') && (i < size); i++) 
{ 
    key_stroke = getchar(); 
    array[i] = (char)key_stroke; 
} 

사용자 프레스 Enter 키를 누를 때까지 또는 어레이의 공간이 소모 될 때까지 배열 []에 추가 될 키. 'i'매 회전마다 증가하므로 색인이 자동으로 업데이트됩니다.

+0

코멘트를 추가하는 방법, "return"은 코멘트를 닫습니다 ?? – user1914074