#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
int in[999];
int i = 0;
while (getchar() != '-1') {
in[i] = getchar();
i++;
}
for (int j = 0; j < i; j++) {
printf("%d", in[i]);
}
return 0;
}
这是最初始的版本,问题颇多
第一点,在 while
循环中,你调用了 getchar()
两次,这会导致你跳过输入的第一个字符
//看来这个不是你想地那么美
第二点,getchar什么都能读,你忽略了重要的空格键、换行符
printf("请输入字符,输入 -1 结束:\n");
// 读取输入,直到遇到 -1
while (1) {
ch = getchar(); // 读取一个字符
if (ch == EOF) { // 如果遇到文件结束符,退出
break;
}
if (ch == '\n') { // 如果输入换行,跳过
continue;
}
// 检查是否输入了 '-1'
if (ch == '-') {
char next = getchar(); // 读取下一个字符
if (next == '1') {
char end = getchar(); // 读取换行符
break; // 如果输入了 -1,退出循环
}
// 如果不是 '1',则将 '-' 和下一个字符存入数组
in[i++] = ch;
in[i++] = next;
} else {
in[i++] = ch; // 存储字符
}
if (i >= 999) { // 防止数组溢出
break;
}
}
// 输出数组内容
printf("输入的字符的 ASCII 值为:\n");
for (int j = 0; j < i; j++) {
printf("%d ", in[j]); // 输出每个字符的 ASCII 值
}
printf("\n");
return 0;
}
这里总结的经验如下:
第一点,使用while无限循环,避免把问题复杂化
第二点,先使用一个变量(如这里的ch)来存getchar的输入值,再判断是否要将ch存到数组in里面(尤为重要,你需要排除如换行符,空格键等不需要的字符)
if (ch == EOF) { // 如果遇到文件结束符,退出
break;
}
if (ch == '\n') { // 如果输入换行,跳过
continue;
}
即使是输入EOF,如果你不break循环,他仍会无限地继续下去
输入换行符,使用continue跳过
第三点,第二点中的变量ch必须要有,因为getchar()
自己返回的是 ASCII 值,getcahr()=='-1'这种类型的代码是错误的
第四点,符号自己也是一个字符,getchar一次只读取一个字符,所以才有:
if (ch == '-') {
char next = getchar(); // 读取下一个字符
if (next == '1') {
char end = getchar(); // 读取换行符
break; // 如果输入了 -1,退出循环
}
//判断next等于1后,就已满足-1的条件,实际不需要再char end读换行符
第五点,getcahr使用于读取字符,读取int类型的数据仅仅是它的功能之一,如果只是读取数字,建议使用简单直接的for循环+内嵌if语句
Comments NOTHING