2013-01-03 72 views
14

Tôi đang cố gắng sử dụng mã này để đọc các giá trị trong khoảng từ 0 đến 255 (unsigned char).Sử dụng scanf để đọc một ký tự chưa được ký

#include<stdio.h> 
int main(void) 
{ 
    unsigned char value; 

    /* To read the numbers between 0 to 255 */ 
    printf("Please enter a number between 0 and 255 \n"); 
    scanf("%u",&value); 
    printf("The value is %u \n",value); 

    return 0; 
} 

Tôi nhận được cảnh báo trình biên dịch như mong đợi.

cảnh báo: định dạng ‘% u’ hy vọng gõ ‘unsigned int *’, nhưng lập luận 2 có kiểu ‘unsigned char *’

Và đây là kết quả của tôi cho chương trình này.

Vui lòng nhập một số từ 0 đến 255 Giá trị là 45 Segmentation lỗi

tôi làm được những lỗi segmentation khi chạy mã này.

Cách tốt nhất để đọc giá trị char chưa ký bằng cách sử dụng scanf là gì?

+0

sử dụng% c để đọc một byte – TJD

+10

Thực ra '% hhu' cho' unsigned char'. – Joe

+0

@TJD. Tôi không muốn đọc một char. Tôi muốn đọc các giá trị từ 0 đến 255. – user1293997

Trả lời

31

Trình chỉ định %u dự kiến ​​một số nguyên sẽ gây ra hành vi không xác định khi đọc vào unsigned char. Bạn sẽ cần phải sử dụng số thông số unsigned char%hhu.

+0

Điều này thực sự tốt - nhưng rất buồn gcc phàn nàn trong chế độ C89/C90 - và thêm ms cũng than phiền: '% hhu' không được hỗ trợ sớm hơn C99 theo như tôi biết. –

+1

@BastianEbeling yes [ở đây] (http://www.cplusplus.com/reference/cstdio/scanf/) 'hh' được đánh dấu là màu vàng có nghĩa là nó vừa được giới thiệu từ C99. Tôi tự hỏi làm thế nào để đọc nó trong C89 –

+1

Có một ví dụ dưới đây mà bây giờ đã bị xóa có sử dụng ['getchar()'] (http://en.cppreference.com/w/cpp/io/c/getchar). – Joe

0

Đối với C99 trước, tôi sẽ xem xét viết một hàm bổ sung cho chỉ một mình để tránh lỗi phân đoạn đó do hành vi không xác định của scanf.

Tiếp cận:

#include<stdio.h> 
int my_scanf_to_uchar(unsigned char *puchar) 
{ 
    int retval; 
    unsigned int uiTemp; 
    retval = scanf("%u", &uiTemp); 
    if ( retval == 1 
     && uiTemp < 256; 
    ) 
    { 
    *puchar = uiTemp; 
    } 
    return retval; 
} 

Sau đó thay thế < scanf ("% u",> với < my_scanf_to_uchar (>

Hy vọng điều này không phải là off topic như tôi vẫn sử dụng scanf và không một chức năng khác như getchar :)

Cách tiếp cận khác (không có chức năng bổ sung)

if (scanf("%u", &uiTemp) == 1 && uiTemp < 256) { value = uitemp; } 
else {/* Do something for conversion error */} 
Các vấn đề liên quan