gpt4 book ai didi

c - gets 在 c 中不起作用

转载 作者:行者123 更新时间:2023-11-30 21:23:34 26 4
gpt4 key购买 nike

在 Bellow C 程序中,gets 不起作用,因此我使用 scanf 从标准输入中获取学生姓名。

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

struct student
{
char name[10];
int roll, sub[6], total, age;
};

int take(int n, struct student s[])
{
int i, j;

for(i=0;i<n;i++)
{
s[i].total=0;
printf("\n\nEnter the name of the %d student :",i+1);
gets(s[i].name);//over here gets is not working
//scanf("%s",s[i].name);
printf("Roll no :");
scanf("%d",&s[i].roll);
printf("Enter your Age : ");
scanf("%d",&s[i].age);
for(j=0;j<6;j++)
{
printf("Enter the Marks of Subject %d : ",j+1);
scanf("%d",&s[i].sub[j]);
s[i].total=s[i].total+s[i].sub[j];
}
}
}

main()
{
int n;
struct student s[10];
printf("Enter how Student Details you want to Enter : ");
scanf("%d",&n);
take(n, s);
}

如何使用获取

最佳答案

scanfgetsfgets 混合使用可能会在换行处理方面出现问题。

在调用 gets 之前,您可以使用格式字符串 "%d" 调用 scanf。这会遍历任何前导空格,然后(宽松地说)读取数字序列并在第一个非数字处停止。完成此调用后,输入缓冲区中会留下一个换行符(以及您在数字后可能输入的任何非数字)。

当您调用 gets 时,它会读取并包括下一个换行符,该换行符将被丢弃。这会导致将空字符串读入 s[i].name

在调用gets之前,您需要刷新输入缓冲区中的所有内容,直到并包括下一个换行符。您可以使用 getchar 循环来完成此操作,如下所示:

int c;
while ((c=getchar()) != '\n' && c != EOF);

此外,您不应使用 gets,因为它无法防止输入缓冲区溢出,从而导致未定义的行为。您应该使用 fgets 来代替:

fgets(&s[i].name, sizeof(s[i].name);
if (strrchr(s[i].name, '\n') != NULL) {
*strrchr(s[i].name, '\n') = 0;
}

如果有空间,fgets 函数将在读取的字符串中包含换行符,因此以下语句将删除换行符(如果存在)。

关于c - gets 在 c 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43453567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com