2010-08-12 4 views
2

Borland C++ v5.02의 C 코드 (C, 제 2 판 - Herbert Schildt)를 컴파일하면 다음과 같은 경고 메시지가 나타납니다. 아래 : "c61.c (7,6) : 변환이 유효 숫자를 잃을 수 있음"getchar() 또는 getche()에 의한 문자 입력에 문제가 발생했습니다.

무엇이 잘못 되었습니까? 또 다른 예와

#include "stdio.h" 

main() 
{ 
char ch; 
ch = getchar(); 
printf(" You typed: %c", ch); 

return 0; 
} 

같은 문제 : 그것은 EOF 같은 문자가 아닌 값을 반환 할 수 있도록

#include "conio.h" 
#include "stdio.h" 

main() 
{ 
char ch; 

printf("Enter a character: "); 
ch = getche(); 
printf("\nIts ASCII code is %d", ch); 

return 0; 
} 
+0

두 번째 예에서 문자 사용 _still_입니다! – paxdiablo

+0

이렇게하십시오 : ch = char (getchar()); – Tebe

답변

6

getchar가은(), int를 반환합니다. 따라서 반환 값을 char과 같은 작은 데이터 유형에 저장하면 잠재적으로 정보가 손실 될 수 있습니다.

Schildt의 서적은 일반적으로 C (또는 C++)를 학습하는 데있어 최악의 것으로 간주되며 이는 그 이유의 좋은 예입니다. 당신은 잘 같은 K & R.

getchar의 프로토 타입은
+0

예, 제가 테스트 해본 예제 중 대부분은 작동하지 않습니다.이 책의 세 번째 판은 150,000 장 이상 판매되었다고 주장합니다. – Sharifhs

+1

@Sharifhs : Schildt의 책에는 아주 나쁜 평판이 있습니다. [ACCU] (http://accu.org/index.php?module=bookreviews&func=search)는 귀하의 도서에 대한 리뷰가 없지만 Schildt의 다른 책에 대한 리뷰에서 아이디어를 얻을 수 있습니다. 더 나은 책에 대한 지침은 http://c-faq.com/resources/books.html을 참조하십시오. K & R은 우수합니다. C가 첫 번째 프로그래밍 언어 인 경우에는 적합하지 않습니다. – Gilles

+0

친애하는 Neil, 나는 그 설명을 정말로 이해하지 못한다고 후회한다. 내가 여기서 사용한 "수익"이라는 용어를 이해할 수 없습니다. "getchar()가 int를 반환하는 것"은 무엇을 의미합니까? – Sharifhs

2

으로, 더 나은 책을받을 것을 권고 할 것이다 : 그것은 문자가 아닌 EOF를 반환해야하기 때문에

int getchar (void); 

그것은이 int를 반환합니다.


그것에 확장은 기능을 사용하면 파일의 끝에 도달하고 있음을 나타내는 특별한 "문자"를 반환 할 수있는뿐만 아니라, 어떤 유효한 문자를 반환 할 수 있어야합니다 (또는 오류가 발생했습니다).

char 데이터 유형은 문자 중 하나만 보유 할 수 있기 때문에 리턴 된 모든 함수가 char이면이 파일 끝을 표시 할 방법이 없습니다. 파일 끝을 나타내는 값이 char 중 하나를 선택한 경우 파일 끝과 실제 문자의 차이를 알 수 없기 때문입니다.

예를 들어 파일 끝을 표시하려면 'A'를 선택하십시오. getchar()에서 'A'를 실제로 가져 왔을 때 파일 끝에 도달했는지 여부 또는 사용자가 실제로 'A'를 입력했는지 여부를 어떻게 알 수 있습니까?

이 해결하기 위해, 다시 당신에게 많은 기능이 char 실제로 당신에게 int을주고이없는 정수 값 중 하나를 사용합니다 상응하는 실제 char (예 : -1).

이 경우 (8 비트 char으로 가정) 파일 끝에 도달하면 -1이 반환되고 입력 한 문자를 나타내는 0부터 255까지의 값이 반환됩니다.


그리고 당신은 더 현대적인 책 보다 현대 컴파일러 모두 자신을 얻을 필요가 :

#include <stdio.h> 
int main (void) { 
    int ch = getchar(); 
    if (ch != EOF) 
     printf("You typed: %c\n", ch); 
    return 0; 
} 

누군가는 왜 여전히 볼랜드는 GCC가 모두 단지 인이 시대입니다 (사용 싸고 그리고 많이) 나보다 낫다.

+0

지금도 작동하지 않습니다 ..... 내 오래된 컴파일러의 문제라고 생각합니까? – Sharifhs

+0

나를 위해 gcc 잘 작동합니다. 조리 된 입력 모드 일 수 있습니다. 즉, 키를 누른 후에 Enter 키를 눌러야 할 수도 있습니다. – paxdiablo

+0

감사합니다 pabdialo, 지금 작동합니다! – Sharifhs

0

대체 프로그램은 어떻게됩니까? 그것은 잘 작동합니다.

#include <stdio.h> 

main() 
{ 
char ch; 

getchar(); 

printf("Enter the character: "); 
scanf("%c", &ch); 
printf(" You typed: %c\n", ch); 
return 0; 
} 

일부 댓글을 남겨주세요.

관련 문제