signed char存储负整数时输入输出异常问题求助
问题根因
- 你使用
%c格式符调用scanf时,每次只会从输入流中读取1个单个字符:输入-9时第一次读取到的是字符'-',输入2时读取到的是字符'2'(ASCII编码对应十进制值为50),这就是你遇到两类异常输出的直接原因。 signed char本身确实可以存储-128~127范围的整数,但你之前的用法是将其用于存储字符的ASCII编码值,没有做输入到数值的转换,自然无法实现存储整数的需求。
实现方案
你可以先读取首个字符判断是否为终止符?,如果不是就将该字符退回输入流,再读取整数存入signed char变量即可,示例代码如下:
#include <stdio.h> int main() { signed char num; char first_char; while (1) { // 读取首个字符判断是否为终止符 scanf("%c", &first_char); if (first_char == '?') { break; } // 将字符退回输入流,用于后续整数读取 ungetc(first_char, stdin); // %hhd是专门用于读取signed char类型整数的格式符 scanf("%hhd", &num); // 输出整数 printf("%d\n", num); // 清空输入流中残留的换行符,避免下一轮循环读入空值 while (getchar() != '\n'); } return 0; }
注意事项
- 读取
signed char类型的整数时,必须使用%hhd格式符,不能直接用%d,后者对应int类型,长度不匹配会引发内存读写错误。 - 本方案支持存储的整数范围为
signed char的原生取值范围:-128 ~ 127,超出该范围的整数会溢出。 - 每次读取完成后清空换行符的操作不可省略,否则下一轮循环会直接读取到残留的换行符,导致逻辑异常。
内容的提问来源于stack exchange,提问作者charlotte
相关产品推荐
相关产品推荐

