11.14 晚自习 用你很少用的getchar读取字符串,以-1为读取结束的标识

发布于 6 天前  9 次阅读


#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语句

届ける言葉を今は育ててる
最后更新于 2024-11-14