Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
程序不';在scanf()之后执行get(),即使使用fflush(stdin)_C_Scanf_Gets_Fflush - Fatal编程技术网

程序不';在scanf()之后执行get(),即使使用fflush(stdin)

程序不';在scanf()之后执行get(),即使使用fflush(stdin),c,scanf,gets,fflush,C,Scanf,Gets,Fflush,在花了太多时间搜索为什么我的程序在使用scanf()之后不执行get()之后,我找到了一个解决方案,即在scanf()之后使用fflush(stdin)来启用get()来获取字符串 问题是,fflush(stdin)没有完成预期的功能:程序继续跳过get(),我无法在控制台中编写任何要读取的短语 我的代码是下一个: #include <string.h> #include <stdio.h> int main(){ char nombre[10]; ch

在花了太多时间搜索为什么我的程序在使用scanf()之后不执行get()之后,我找到了一个解决方案,即在scanf()之后使用fflush(stdin)来启用get()来获取字符串

问题是,fflush(stdin)没有完成预期的功能:程序继续跳过get(),我无法在控制台中编写任何要读取的短语

我的代码是下一个:

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

int main(){
    char nombre[10];
    char mensaje[80];

    printf("Type your name:\n");
    scanf("%s", nombre);

    fflush(stdin);

    printf("Now, type a message:\n");
    gets(mensaje);

    printf("3/%s:%s",nombre,mensaje);
    return 0;
}
#包括
#包括
int main(){
字符名称[10];
查尔门萨耶[80];
printf(“键入您的姓名:\n”);
scanf(“%s”,名称);
fflush(stdin);
printf(“现在,键入一条消息:\n”);
获取(mensaje);
printf(“3/%s:%s”,名称,mensaje);
返回0;
}
试试这个:

scanf("%s\n", nombre);
在读取零件时,scanf在空白处停止。获取直到第一个新行为止的读取。所以,scanf会在缓冲区中留下一个换行符,它会立即看到并认为它得到了一个空行

如果您使用原始代码并输入“name message”,两部分都在一行上,您可以看到这一点——gets仍将立即返回,但它将看到第二部分

scanf东西中的\n告诉它也继续使用它。

试试这个:

scanf("%s\n", nombre);
在读取零件时,scanf在空白处停止。获取直到第一个新行为止的读取。所以,scanf会在缓冲区中留下一个换行符,它会立即看到并认为它得到了一个空行

如果您使用原始代码并输入“name message”,两部分都在一行上,您可以看到这一点——gets仍将立即返回,但它将看到第二部分

scanf东西中的\n告诉它继续并使用它。

Try
get(stdin)而不是

fflush(stdin);
尝试
get(stdin)而不是

fflush(stdin);

如果刷新std不起作用,那么按照建议尝试读取额外字符并丢弃

这将有助于:

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

int main(){
    char nombre[10];
    char mensaje[80];
    int c;

    printf("Type your name:\n");
    scanf("%9s", nombre);

    while((c= getchar()) != '\n' && c != EOF)
            /* discard */ ;

    printf("Now, type a message:\n");
    gets(mensaje);

    printf("%s:%s",nombre,mensaje);
    return 0;
}
#包括
#包括
int main(){
字符名称[10];
查尔门萨耶[80];
INTC;
printf(“键入您的姓名:\n”);
scanf(“%9s”,名称);
而((c=getchar())!='\n'&&c!=EOF)
/*丢弃*/;
printf(“现在,键入一条消息:\n”);
获取(mensaje);
printf(“%s:%s”,名称,mensaje);
返回0;
}

如果刷新std不起作用,则按照建议尝试读取额外字符并丢弃

这将有助于:

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

int main(){
    char nombre[10];
    char mensaje[80];
    int c;

    printf("Type your name:\n");
    scanf("%9s", nombre);

    while((c= getchar()) != '\n' && c != EOF)
            /* discard */ ;

    printf("Now, type a message:\n");
    gets(mensaje);

    printf("%s:%s",nombre,mensaje);
    return 0;
}
#包括
#包括
int main(){
字符名称[10];
查尔门萨耶[80];
INTC;
printf(“键入您的姓名:\n”);
scanf(“%9s”,名称);
而((c=getchar())!='\n'&&c!=EOF)
/*丢弃*/;
printf(“现在,键入一条消息:\n”);
获取(mensaje);
printf(“%s:%s”,名称,mensaje);
返回0;
}
两大主要问题:

  • 不要在输入流上使用
    fflush
    ;未定义输入流上的
    fflush
    行为。仅仅因为它在这种情况下起作用并不意味着它是正确的

  • 永不使用
    获取
    -它在C99标准中被弃用,并已从C2011标准中完全删除。它将
    (而不是may,will)在代码中引入一个主要的故障点

  • get
    调用跟随
    scanf
    调用从来都不是一个好主意,因为
    get
    不会跳过
    scanf
    在输入流中留下的任何前导换行。使用
    scanf
    读取
    nombre
    mesaje

    printf("Type your name:\n");
    scanf("%9s", nombre);
    
    printf("Now, type a message:\n");
    scanf("%79s", mensaje);
    
    最好在
    scanf
    调用
    %s
    %[
    中使用显式长度说明符,否则会引入与
    相同的安全漏洞

    编辑

    哦。我是个白痴。如果你试图读取包含空格的字符串,你不能使用
    %s
    转换说明符。请改用
    %[
    转换说明符:

    scanf( "%79[^\n]", mensage );
    
    这将最多读取79个字符或换行符,以先到者为准,并将换行符保留在输入流中。

    两个重大问题:

    while (fgetc(stdin) != '\n'); // seems to work
    
  • 不要在输入流上使用
    fflush
    ;未定义输入流上的
    fflush
    行为。仅因为它在这种情况下工作并不意味着它是正确的

  • 永不使用
    get
    -它在C99标准中被弃用,并已从C2011标准中完全删除。它(不可能,将)在代码中引入一个主要故障点

  • get
    调用跟随
    scanf
    调用从来都不是一个好主意,因为
    get
    不会跳过
    scanf
    在输入流中留下的任何前导换行。使用
    scanf
    阅读
    nombre
    mesaje

    printf("Type your name:\n");
    scanf("%9s", nombre);
    
    printf("Now, type a message:\n");
    scanf("%79s", mensaje);
    
    最好在
    scanf
    调用
    %s
    %[
    中使用显式长度说明符,否则会引入与
    相同的安全漏洞

    编辑

    哦。我是个白痴。如果你试图读取包含空格的字符串,你不能使用
    %s
    转换说明符。请改用
    %[
    转换说明符:

    scanf( "%79[^\n]", mensage );
    

    这将最多读取79个字符或换行符,以先到者为准,并将换行符保留在输入流中。

    请阅读:(与您的问题无关)。可能重复将最后一个
    printf
    更改为
    printf(“3/%s:%s\n”,nombre,mensaje)它运行不好,因为当程序到达那一行时,消息(mensaje)必须被写入,而我无法写入任何内容,因为get()一直在跳过don
    fflush(stdin)
    while (fgetc(stdin) != '\n'); // seems to work