You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言for循环随机中断问题求助:含空格输入触发异常

C语言循环与输入问题的修复方案

问题根源

  1. 输入流混乱:第二个循环里多余的getchar()会直接吃掉输入行的第一个字符,甚至把换行符当成有效输入,导致fgets读不到正确内容,看起来像是循环提前“中断”。
  2. 致命格式错误:第29行的printf("%s", p[count][2])完全错误——p[count][2]是单个字符,%s却要求传入字符串指针,这会触发未定义行为,轻则输出乱码,重则程序直接崩溃,也就是你改索引后循环立刻中断的原因。

修正后的完整代码

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>

int main(){
    int players;
    int jerseys;
    int count = 0;
    
    scanf("%d", &jerseys);
    scanf("%d", &players);

    // 注意:如果jerseys/players为0,变长数组会出问题,建议提前加判断
    char size[jerseys], p[players][100];

    // 读取球衣尺码:用scanf的空格跳过空白符,不用额外getchar
    for(int j = 0; j < jerseys; j++){
        scanf(" %c", &size[j]); 
    }

    // 只需要一次getchar,吃掉之前scanf留下的最后一个换行
    getchar();
    count = 0;
    // 用独立的循环变量,别修改原始的players变量
    for(int p_idx = 0; p_idx < players; p_idx++){
        fgets(p[count], 100, stdin);
        // 去掉fgets自带的换行符,避免后续处理出错
        p[count][strcspn(p[count], "\n")] = '\0';
        
        printf("读取到的请求:%s\n", p[count]);
        // 访问单个字符必须用%c,且要确保字符串长度足够
        if(strlen(p[count]) >= 3){
            printf("索引2的字符:%c\n", p[count][2]);
        }
        printf("Hello\n");
        count++;
    }       

    return 0;
}

关键修改说明

  • 不修改原始变量:之前的循环直接修改jerseys和players,会导致后续无法再使用这些变量的原始值,改用独立的循环索引(比如j、p_idx)更安全。
  • 清理输入流:读取单个字符时,scanf(" %c")里的空格会自动跳过所有空白字符(换行、空格等),不需要额外的getchar();读取整行前只需要一次getchar()清理残留的换行符。
  • 修正输出格式:单个字符必须用%c输出,字符串用%s,二者不能混用,否则必然引发错误。
  • 处理换行符:fgets会把输入的换行符也读入字符串,用strcspn可以快速去掉换行符,保证字符串格式干净。

对应Python的分割逻辑实现

如果要实现Python里input().split()的分割效果,读取每行后可以用strtok函数处理:

// 在读取并处理完p[count]后添加以下代码
char *token = strtok(p[count], " ");
if(token){
    printf("尺码:%s\n", token);
    token = strtok(NULL, " ");
    if(token){
        printf("数字:%s\n", token);
    }
}

内容的提问来源于stack exchange,提问作者Deltag0ny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:10:14