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

C语言结构体中无法输入带空格字符串的问题求助

解决C语言结构体中输入含空格姓名被截断的问题

你的问题出在**scanf("%s")的读取规则**:%s格式符会将空格、换行、制表符等空白字符视为输入结束标记,所以只能读取空格前的部分内容。下面提供两种可靠的解决方法:

方法一:使用fgets读取整行姓名

fgets可以读取整行输入(包括空格),直到遇到换行符或达到指定长度。需要注意两个细节:

  1. 读取学生数量n后,输入缓冲区会残留换行符,需先清空;
  2. fgets会把换行符也读入字符串,要手动去除。

修改后的核心代码片段:

printf("How many Students? : ");
scanf("%d", &n);
// 清空输入缓冲区残留的换行符
while (getchar() != '\n');

// ... 其他代码 ...

printf("Enter Name : ");
// 读取整行姓名,限制长度为name数组的大小
fgets(ptr->name, sizeof(ptr->name), stdin);
// 去除字符串末尾的换行符
ptr->name[strcspn(ptr->name, "\n")] = '\0';

方法二:使用scanf的%[^\n]格式符

%[^\n]表示读取所有字符直到遇到换行符,配合前面的空格可以跳过缓冲区残留的空白字符。为了避免缓冲区溢出,要指定最大读取长度(name数组是30位,所以限制为29,留1位给字符串终止符\0)。

修改后的读取姓名代码:

printf("Enter Name : ");
// 空格用于跳过之前的换行符,%29[^\n]限制读取29个字符直到换行
scanf(" %29[^\n]", ptr->name);

完整修改后的代码示例(使用fgets版本)

// mark list using struct
#include <stdio.h> 
#include <string.h>

struct mlist { 
    char name[30]; 
    int cs; 
    int maths; 
    int eng; 
    int total; 
    float perc; 
};

int main() { 
    int n, i;
    printf("How many Students? : ");
    scanf("%d", &n);
    // 清空输入缓冲区的换行符
    while (getchar() != '\n');

    struct mlist std[n];
    struct mlist *ptr = std;

    printf("Marks out of 100\n");

    for (i = 0; i < n; i++)
    {
        printf("\n\nEnter details of Student %d ==>\n", i + 1);
        printf("Enter Name : ");
        fgets(ptr->name, sizeof(ptr->name), stdin);
        ptr->name[strcspn(ptr->name, "\n")] = '\0';
        
        printf("Enter Computer Science Marks : ");
        scanf("%d", &ptr->cs);
        printf("Enter Mathematics Marks : ");
        scanf("%d", &ptr->maths);
        printf("Enter English Marks : ");
        scanf("%d", &ptr->eng);
        // 清空每次输入成绩后残留的换行符,避免影响下一次fgets
        while (getchar() != '\n');
        ptr++;
    }

    ptr = std;
    for (i = 0; i < n; i++)
    {
        printf("\n---------------------------------\n");
        printf("Name : %s\n", ptr->name);
        printf("Computer Science : %d\n", ptr->cs);
        printf("Mathematics : %d\n", ptr->maths);
        printf("English : %d\n", ptr->eng);
        ptr->total = ptr->cs + ptr->maths + ptr->eng;
        ptr->perc = (float)ptr->total / 300 * 100;
        printf("Total %d with %.2f%%\n", ptr->total, ptr->perc);
        ptr++;
    }
    return 0;
}

注意:每次用scanf读取成绩后,也要清空缓冲区的换行符,否则下一次fgets会直接读取到这个换行符,导致姓名输入为空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:35:04