W77yyds 2024-03-15 18:59 采纳率: 100%
浏览 4
已结题

关于结构体的问题%c和%s

为什么在输入学生数据函数中,%c来写入&pstu[i].sex的值就不行?用%s就可以呢?结构体中char sex
不是单个字符吗?

img

img

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2024-03-15 19:00
    关注

    W77yyds 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    在输入学生数据函数中,%c和%s在读取字符的方式上是有区别的。

    1. 使用%c读取字符可以成功,但是会遇到问题:使用%c读取字符时会包括输入时留下的换行符(\n),这是因为%c会读取输入缓冲区中的一个字符,而换行符会被认为是一个可读取的字符。

    2. 使用%s读取字符串可以解决问题:使用%s读取字符串时,会读取输入缓冲区中的一个字符串,直到遇到空白字符(空格、制表符或换行符)为止,所以可以正常读取到为性别指定的字符。

    解决方案:

    1. 使用%c读取性别字符时,需要在%c之前加一个空格,用于吸收输入缓冲区中的换行符,即scanf(" %c",&pstu[i].sex)

    2. 使用%s读取性别字符串时,需要保证输入的性别只有一个字符,否则可能会造成溢出,并且需要保证输入的性别字符和下一个需要读取的数据之间有空格,否则会出错。

    修改后的代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    
    struct Student {
        int age;
        float score;
        char sex;
    };
    
    void input(struct Student *pstu, int n);
    
    int main() {
        int num;
        printf("请输入学生人数:");
        scanf("%d", &num);
        struct Student *pst = (struct Student*)malloc(sizeof(struct Student) * num);
        input(pst, num);
        return 0;
    }
    
    void input(struct Student *pstu, int n) {
        for(int i = 0; i < n; i++) {
            printf("请输入性别:");
            scanf(" %c", &pstu[i].sex);
            printf("请输入年龄:");
            scanf("%d", &pstu[i].age);
            printf("请输入成绩:");
            scanf("%f", &pstu[i].score);
        }
    }
    

    修改后的代码中将输入函数input的声明放在了结构体Student的后面,并对输入性别字符的部分进行了修改。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月15日
  • 创建了问题 3月15日