注册 登录
编程论坛 C++教室

为什么for循环不能循环输入 while循环就可以 TAT

bug芒果核 发布于 2025-09-18 22:31, 2835 次点击
hi hi hi 大牛 帮帮小菜吧
for循环
#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        char a[8];
        scanf("%s",&a);
        if(a[4]=='1') printf("chuanyuan %c%c%c\n",a[5],a[6],a[7]);
        else printf("shie %c%c%c\n",a[5],a[6],a[7]);   
    }
    return 0;
}
while循环
#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        char a[8];
        scanf("%s",&a);
        if(a[4]=='1') printf("chuanyuan %c%c%c\n",a[5],a[6],a[7]);
        else printf("shie %c%c%c\n",a[5],a[6],a[7]);   
    }
    return 0;
}
题目
题目描述

热烈欢迎 新北航人! ggengx 是一名迎新志愿者,他需要根据学号判断出新生来自 传源书院 还是 士谔书院(当然还有很多其他学院,为了简化处理就不考虑啦)。并送上相应的开学大礼包。
已知:
25级传源书院新生的学号组成为 25371xxx,例如 25371001 、 25371271
25级士谔书院新生的学号组成为 25373xxx,例如 25373080 、 25373173
输入
共 n+1行输入
第一行输入正整数 n表示有n个学号1≤n≤1×103
后续n行,每行输入一个学号(8位)例如 25373271,保证输入的学号是 25级传源/士谔书院的合法学号
输出
共n行,对于每一个学号,需要有两样输出
输出其学院名称 :如果是传源书院的学生,输出chuanyuan;
如果是士谔书院的学生,输出shie
输出学号后三位学院名称与学号后三位之间使用一个空格分割
输入样例
3
25371001
25371498
25373211
输出样例
chuanyuan 001
chuanyuan 498
shie 211
4 回复
#2
rjsp2025-09-19 08:30
你的错误代码
char a[8];
scanf("%s",&a);

正确代码,可以是
char a[9];
scanf("%s",a);
也可以是
char a[8];
scanf(" %8c",a); // 另外,注意格式化字符串首位是个空格



#3
bug芒果核2025-09-19 13:38
回复 2楼 rjsp
删去&我懂了
但为什么要把8换成9,不然就要写%8c
(我真心不知道,大牛不要厌蠢
(是因为a[0]是空格?

[此贴子已经被作者于2025-9-19 13:46编辑过]

#4
rjsp2025-09-19 16:48
%s 是读入一个字符串(以'\0'结尾),你需要读入一个8位的学号,包括字符串尾部的'\0'在内,就需要 char[9]。如果是char a[8]的话,会导致缓冲区溢出。

%8c 是读入8个字符,因为没有尾部的'\0',所以它只需要char[8]。之所以 " %8c" 中前端有个空格,是需要略过前导的空白字符(回车、换行 等等都属于空白字符);而"%s"不要的原因是,它本身就会忽略掉前导的空白字符。
#5
bug芒果核2025-09-21 16:53
回复 4楼 rjsp
SOUGA 大佬辛苦
1