C++中字符数组的输入

 胡宸宸 发布于 2022-11-01 05:28

如上图,红线框起来的部分,为什么字符数组的输入放到里面出来的结果是不正确的,而按照下面的方法,放到循环的外面去输入运行结果是正确的?

正确放法图
下面放完整代码:

#include
#include
using namespace std;
int main(){
        char n[100] = { 0 };
        int sum = 0;
        cin>>n;
        int i, number, mask = 1;
        for (i = 0; n[i] != 0; i++) {
            sum += (int)n[i] - 48;
        }
        int a = sum;
        while (a>9){
            a /= 10;
            mask *= 10;
        }

        do{
            number = sum / mask;
            sum %= mask;
            mask /= 10;
            switch (number){
            case 0:printf("ling"); break;
            case 1:printf("yi"); break;
            case 2:printf("er"); break;
            case 3:printf("san"); break;
            case 4:printf("si"); break;
            case 5:printf("wu"); break;
            case 6:printf("liu"); break;
            case 7:printf("qi"); break;
            case 8:printf("ba"); break;
            case 9:printf("jiu"); break;
            }
            if (mask>0){
                printf(" ");
            }
        } while (mask>0);

    system("pause");
    return 0;
}

这个题的题目
![图片描述][3]

我的错误的代码:

#include
#include
using namespace std;
int main(){
    char n[100] = { 0 };
    int sum = 0, number, mask = 1;
    for (int i = 0; i != 0; i++){
        cin >> n[i];
        sum = sum + (int)n[i] - 48;
    }
    int a = sum;
    while (a > 9){
        a = a / 10;
        mask = mask * 10;
    }
    do{
        number = sum / mask;
        sum = sum % mask;
        mask = mask / 10;
        switch (number){
        case 0:printf("ling");
            break;
        case 1:printf("yi");
            break;
        case 2:printf("er");
            break;
        case 3:printf("san");
            break;
        case 4:printf("si");
            break;
        case 5:printf("wu");
            break;
        case 6:printf("liu");
            break;
        case 7:printf("qi");
            break;
        case 8:printf("ba");
            break;
        case 9:printf("jiu");
            break;
        default:break;
            if (mask > 0){
                printf(" ");
            }
        }

    } while (mask > 0);
    system("pause");
    return 0;
}

为什么字符数组的输入不放到循环里面呢?而且放到里面的运行结果是错误的。

4 个回答
  • for (int i = 0; i != 0; i++){是什么鬼

    2022-11-01 10:34 回答
  • 因为这是io操作,系统调用速度慢,所以一般会一次性读较多数据再用buffer用来缓存,这里的cin应该是line buffered,一次性读取一行数据。如果你想要用循环的方式,需要用getchar函数,但这样效率低,不是推荐的方式。

    2022-11-01 10:39 回答
  • 事实上,cin放循环内外都可以的。
    循环外的不用说了,你都搞定了。
    循环内其实是个逻辑错误,循环内的代码从来没有执行过
    第一行你已经初始化n[100] 成'0'*100,
    所以之后循环的条件的结果永远是False,因为n[i]永远等于0。
    程序会永远忽略循环跳到第11行继续执行。

    2022-11-01 10:41 回答
  • 正如楼上的,这是无限循环啊!

    直接cin>>n,就把字符输入了。是这个问题吗?是因为在输入时系统在内存中开辟了一段缓冲区,来暂存输入输出流的数据,然后再把缓冲区的数据取出来赋值给n,n是数组的首地址么所以就相当于赋值给了数组n[100];你这问题去看C++的输入输出流。

    2022-11-01 11:11 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有