为什么使用fgets函数录入的字符串数组不能正常使用strcmp函数比较。

题目情景:输入星期几的英文,输出其对应的数字(如输入Sunday,输出数字0,输入Monday,输出数字1……)若未找到,则提示错误信息。

#include<stdio.h>

#include<string.h>

int main()

{

int i;

char week[7][20] = { "Sunday","Monday","Tuesday","Wednesday"

,"Thursday","Friday","Saturday" };

char wt[20]=" ";

printf("请输入英文星期几:");

//scanf("%s", wt);

fgets(wt,20,stdin);

wt[strlen(wt) - 1] = '\0'; //如果没有这一行代码不管输入什么都无法正常进行比较

for (i = 0; i < 7; i++)

{

if (strcmp(week[i], wt) == 0)

{

printf("%d", i);

break;

}

}

if (i == 7)printf("对不起没有找到");

return 0;

原因就在于,使用fgets函数录入时会默认在数组最后面,也就是\0之前加上一个回车符‘\n’,相当于wt[20]={'M','o','n','d','a','y','\n','\0'}(假设输入的是Monday)。
那么就好办了,直接把'\n'给替换掉就好了。
使用strlen函数找到数组最后一位,然后对前一位进行替换,代码也就是
wt[strlen(wt) - 1] = '\0';

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是代码实现: ```c #include <stdio.h> #include <string.h> #define MAX_STUDENT 100 // 最多学生数 struct Student { char name[20]; // 姓名 int score; // 成绩 }; struct Student students[MAX_STUDENT]; // 学生信息数组 int studentCount = 0; // 学生数 // 添加学生信息 void addStudent() { if (studentCount >= MAX_STUDENT) { printf("学生信息已满,无法添加!\n"); return; } struct Student student; printf("请输入学生姓名:\n"); scanf("%s", student.name); printf("请输入学生成绩:\n"); scanf("%d", &student.score); students[studentCount++] = student; printf("添加学生信息成功!\n"); } // 输出学生信息 void showStudents() { if (studentCount == 0) { printf("当前没有学生信息!\n"); return; } printf("姓名\t成绩\n"); for (int i = 0; i < studentCount; i++) { printf("%s\t%d\n", students[i].name, students[i].score); } } // 查询学生信息 void searchStudent() { char name[20]; printf("请输入学生姓名:\n"); scanf("%s", name); for (int i = 0; i < studentCount; i++) { if (strcmp(students[i].name, name) == 0) { printf("姓名\t成绩\n"); printf("%s\t%d\n", students[i].name, students[i].score); return; } } printf("未找到该学生信息!\n"); } // 比较函数,用于排序 int cmp(const void* a, const void* b) { struct Student* s1 = (struct Student*) a; struct Student* s2 = (struct Student*) b; return s2->score - s1->score; } // 按照成绩排序并输出 void sortStudents() { if (studentCount == 0) { printf("当前没有学生信息!\n"); return; } qsort(students, studentCount, sizeof(struct Student), cmp); printf("姓名\t成绩\n"); for (int i = 0; i < studentCount; i++) { printf("%s\t%d\n", students[i].name, students[i].score); } } int main() { int choice; while (1) { printf("1. 录入学生信息\n"); printf("2. 显示学生信息\n"); printf("3. 查询学生信息\n"); printf("4. 按照成绩排序并输出\n"); printf("0. 退出\n"); printf("请输入你的选择:\n"); scanf("%d", &choice); switch (choice) { case 1: addStudent(); break; case 2: showStudents(); break; case 3: searchStudent(); break; case 4: sortStudents(); break; case 0: printf("谢谢使用!\n"); return 0; default: printf("无效的选择!\n"); break; } } return 0; } ``` 代码中定义了一个`Student`结构体来存储学生姓名和成绩,然后使用一个`students`数组来存储学生信息。通过循环显示菜单,用户输入对应的数字来进行相应的操作。具体实现如下: 1. 添加学生信息:从用户输入中读取学生姓名和成绩,然后将其添加到`students`数组中。如果`students`数组已满,则提示添加失败。 2. 显示学生信息:遍历`students`数组,输出每个学生的姓名和成绩。如果`students`数组为空,则提示当前没有学生信息。 3. 查询学生信息:从用户输入中读取学生姓名,然后遍历`students`数组查找该学生信息。如果找到则输出该学生的姓名和成绩,否则提示未找到该学生信息。 4. 按照成绩排序并输出:使用`qsort`函数按照成绩从高到低排序`students`数组,然后遍历数组输出每个学生的姓名和成绩。如果`students`数组为空,则提示当前没有学生信息。 需要注意的是,为了让程序界面美观,我们在输出菜单和提示信息时使用了换行符`\n`和制表符`\t`,同时在读取字符串使用了`scanf`函数,可以通过在字符串中添加空格或使用`fgets`函数来避免读取字符串时出现的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值