Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fgets()和scanf(“%quot;[^\n]”)都被跳过_C - Fatal编程技术网

fgets()和scanf(“%quot;[^\n]”)都被跳过

fgets()和scanf(“%quot;[^\n]”)都被跳过,c,C,我正在做我的c项目,刚刚开始。我需要从用户输入中获取“名称” fgets()在主函数内部工作正常,但在主函数外部使用时跳过。我发现了许多相关问题,因此我阅读了所有答案,但无法解决我的问题 在阅读了一些答案之后,我尝试使用“fflush(stdin)”,scanf([%^\n]”) 但是没有爱 void newacc() { struct tenant new; printf("Enter Name:"); fgets(new.

我正在做我的c项目,刚刚开始。我需要从用户输入中获取“名称”

fgets()在主函数内部工作正常,但在主函数外部使用时跳过。我发现了许多相关问题,因此我阅读了所有答案,但无法解决我的问题

在阅读了一些答案之后,我尝试使用“fflush(stdin)”,scanf([%^\n]”) 但是没有爱

void newacc()
    {       
        struct tenant new;
        printf("Enter Name:");
        fgets(new.name,20,stdin);
        printf("\nEnter Phone number:\n");
        scanf("%d",&new.ph);
        printf("Enter Rental Date (DD-MM-YYYY):\n");
        scanf("%d%d%d",&new.td.dd,&new.td.mm,&new.td.yy);
    }
试试这个

#include <stdio.h>

void newacc()
{ 
    struct tenant per;
    printf("Enter Name:");
    gets_s(per.name,20);
    printf("\nEnter Phone number:\n");
    scanf("%d",&per.ph);
    printf("Enter Rental Date (DD-MM-YYYY):\n");
    scanf("%d%d%d",&per.td.dd,&per.td.mm,&per.td.yy);
}
#包括
void newacc()
{ 
每个租户的结构;
printf(“输入名称:”);
获取_s(根据名称,20);
printf(“\n输入电话号码:\n”);
scanf(“%d”、&per.ph);
printf(“输入租赁日期(DD-MM-YYYY):\n”);
scanf(“%d%d%d”、&per.td.dd、&per.td.mm、&per.td.yy);
}

自从<代码>新< /Cord>是C++的关键字,这里是一个坏名字


请尽量不要同时使用
scanf
fgets

我不熟悉scanf,但您是第二个scanf(“%d%d%d”)似乎容易出错。你怎么知道跳过了什么

这是一个希望在DD、MM和YYYY之间留有空格(“%d%d%d”)的版本,这样每个数字就可以清楚地分开。您收集输入的方式还有其他问题,但我看不到任何遗漏

#include <stdio.h>

void newacc()
{
    char    name[20];
    int     phone;
    int     day;
    int     month;
    int     year;

    printf("Enter Name: ");
    fgets(name,20,stdin);
    printf("Enter Phone number: ");
    scanf("%d",&phone);
    printf("Enter Rental Date (DD MM YYYY):\n");
    scanf("%d %d %d",&day, &month, &year);
    printf("%s %d %02d-%02d-%04d\n", name, phone, day, month, year);
}

int main(void)
{
    newacc();
    return (0);
}
#包括
void newacc()
{
字符名[20];
国际电话;
国际日;
整月;
国际年;
printf(“输入名称:”);
fgets(名称,20,标准DIN);
printf(“输入电话号码:”);
scanf(“%d”和电话);
printf(“输入租赁日期(DD-MM-YYYY):\n”);
scanf(“%d%d%d”、&day、&month、&year);
printf(“%s%d%02d-%02d-%04d\n”,姓名、电话、日期、月份、年份);
}
内部主(空)
{
newacc();
返回(0);
}

在上一次输入后,输入缓冲区中可能会留下一条离群的换行符?没有密码很难说。千万不要把
scanf
fgets
混在一起。如果必须使用
scanf
,请使用
scanf
读取所有输入-不要尝试将
fgets
getc
/
getchar
混合在一起。如果你试着把它们混在一起,你会有换行符和其他空格的问题,直到你的生活结束。(如果您坚持使用
scanf
,您仍然必须小心
%c
%[…]
,因为它们处理空白的方式不同于
scanf
的其他输入指令。)还请注意,c规范明确提到在仅输入流上调用
fflush
(如
stdin
)作为未定义的行为。某些系统将其添加为不可移植的扩展,从不使用它。您如何知道它“被跳过”所有的调用都是什么意思?检查所有调用的返回状态,代码< FSID和 SCANF。直到你知道它们在做什么,你真的不能期望解决这个问题。你真的打算New?TD.MM是一个负值吗?“New”是C++的关键字,而不是C,这是OP被标记为坏名字的任何情况。ets已经被弃用了很长一段时间。它只应该在复制1985年以前的文本时使用,即使是在1985年之前,也必须附带一条警告,禁止在新代码中使用。@Andy你是对的,在这方面确实是个很坏的名字case@WilliamPursell是的gets()是去润滑的,但我认为gets_s()可以使用它完全取决于在这种情况下使用哪个版本的编译器如果它是最新的,那么我们必须使用
#include
而不是
#include
@hrishavdhawajpurkayasta您使用的
不正确。它需要传递一个
size
参数。它在许多th的实现中也不存在e标准C库,请改用
fgets