Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
c编程:(scanf和get)_C_String_Scanf_Gets - Fatal编程技术网

c编程:(scanf和get)

c编程:(scanf和get),c,string,scanf,gets,C,String,Scanf,Gets,我知道scanf()和gets()函数的区别在于scanf()会继续读取输入字符串,直到遇到空白,而gets()会继续读取输入字符串,直到遇到\n或EOF(文件结尾) 为了看到行动上的差异,我试着自己写了一个例子,如下所示: #include <stdio.h> int main() { char a[20];

我知道scanf()和gets()函数的区别在于scanf()会继续读取输入字符串,直到遇到空白,而gets()会继续读取输入字符串,直到遇到\n或EOF(文件结尾)

为了看到行动上的差异,我试着自己写了一个例子,如下所示:

                 #include <stdio.h>
                  int main()
                {    
                   char a[20];
                   printf("enter the string\n");
                   scanf("%s",&a);
                   printf("the string is %s\n",a);
                   char b[20];
                   printf("enter the string\n");
                   gets(b);
                   printf("the string is %s\n",b);
                   return 0;
                }
我期望作为输出的只是字符串的第一部分,它被赋予变量a,即曼彻斯特,然后,程序提示我为变量b输入新的输入字符串。 相反,我最终得到了上述给定的输出

根据输出,我了解到:

可以看出,只要scanf()遇到空白,它就会停止读取字符串,从而停止读取字符串的其余部分 字符串:united,已分配给变量b,即使程序没有提示我输入变量b的字符串

如何清除给定给变量a的字符串的剩余部分(空格后的部分)

因此,我可以为变量b输入一个全新的输入字符串

如果您能进一步解释代码执行过程中发生的情况,我们将不胜感激

为最基本的错误道歉(从回答中可以明显看出)!!
只是一个C编程新手:)

您可以通过手动读取和丢弃字符来刷新它,直到找到一个
'\n'
,或者有人点击适当的组合键导致
EOF
。或者您可以要求
scanf()
放弃所有内容,直到找到一个
'\n'
,第二个可以这样实现

char string[20];
scanf("%19s%*[^\n]\n", string);
你的代码还有其他一些地方是错误的

  • a
    声明为20个
    char
    的数组,然后将其地址传递给
    scanf()
    ,在那里它需要一个
    char
    指针,数组名称(如果您愿意,变量)会在必要时自动转换为指向
    char
    的指针

  • 您使用了
    gets()
    ,它是一个旧的、危险的、不推荐使用的函数,不再是标准函数。您应该使用
    fgets()
    ,它接受一个参数来溢出目标数组

  • 这是一个测试建议修复的示例

    #include <stdio.h>
    
    int
    main(void)
    {    
        char string[20];
    
        string[0] = '\0'; /* Avoid Undefined behaviour 
                             when passing it to `fprintf()' */
    
        scanf("%19s%*[^\n]\n", string);
        fprintf(stdout, "%s\n", string);
    
        fgets(string, sizeof(string), stdin);
        fprintf(stdout, "%s\n", string);
    
        return 0;
    }
    
    #包括
    int
    主(空)
    {    
    字符串[20];
    字符串[0]='\0';/*避免未定义的行为
    将其传递给'fprintf()'时*/
    scanf(“%19s%*[^\n]\n”,字符串);
    fprintf(标准输出,“%s\n”,字符串);
    fgets(字符串、sizeof(字符串)、stdin);
    fprintf(标准输出,“%s\n”,字符串);
    返回0;
    }
    
    您可以通过手动读取并丢弃字符来刷新它,直到找到一个
    '\n'
    或有人点击相应的组合键导致
    EOF
    。或者您可以要求
    scanf()
    放弃所有内容,直到找到一个
    '\n'
    ,第二个可以这样实现

    char string[20];
    scanf("%19s%*[^\n]\n", string);
    
    你的代码还有其他一些地方是错误的

  • a
    声明为20个
    char
    的数组,然后将其地址传递给
    scanf()
    ,在那里它需要一个
    char
    指针,数组名称(如果您愿意,变量)会在必要时自动转换为指向
    char
    的指针

  • 您使用了
    gets()
    ,它是一个旧的、危险的、不推荐使用的函数,不再是标准函数。您应该使用
    fgets()
    ,它接受一个参数来溢出目标数组

  • 这是一个测试建议修复的示例

    #include <stdio.h>
    
    int
    main(void)
    {    
        char string[20];
    
        string[0] = '\0'; /* Avoid Undefined behaviour 
                             when passing it to `fprintf()' */
    
        scanf("%19s%*[^\n]\n", string);
        fprintf(stdout, "%s\n", string);
    
        fgets(string, sizeof(string), stdin);
        fprintf(stdout, "%s\n", string);
    
        return 0;
    }
    
    #包括
    int
    主(空)
    {    
    字符串[20];
    字符串[0]='\0';/*避免未定义的行为
    将其传递给'fprintf()'时*/
    scanf(“%19s%*[^\n]\n”,字符串);
    fprintf(标准输出,“%s\n”,字符串);
    fgets(字符串、sizeof(字符串)、stdin);
    fprintf(标准输出,“%s\n”,字符串);
    返回0;
    }
    
    首先,在阅读问题之前,不应使用
    gets()
    ,并且在标准的最新版本中,它已被弃用。您的代码还存在多个其他问题,例如使用
    &
    运算符将
    “%s”
    说明符的数组传递给
    scanf()
    。如果编译器(或运行时?,因为我永远不会使用
    gets()
    我不知道有警告)发出警告,为什么要继续使用它?永远不要使用
    gets
    !它甚至被从C标准中删除,这是一个非常罕见的事件。
    scanf(“%s”,b)
    =
    得到(b)
    ==一个漏洞,您的用户可能会通过这个漏洞崩溃或控制您的程序。您的问题实际上是“当我实际上不想做scanf所做的事情时,我如何使用scanf”。最好的答案是“不要使用scanf”。如果确实要读取一行,请使用一些读取该行的函数,然后使用类似于
    sscanf
    的方法来解析所读取的行。@iharob:是否使用
    &
    运算符将
    %s
    说明符的数组传递给
    scanf()
    调用未定义的行为?我认为是这样!!!首先,在阅读问题之前,
    gets()
    不应使用,并且在标准的最新版本中已被弃用。您的代码还存在多个其他问题,例如使用
    &
    运算符将
    “%s”
    说明符的数组传递给
    scanf()
    。如果编译器(或运行时?,因为我永远不会使用
    gets()
    我不知道有警告)发出警告,为什么要继续使用它?永远不要使用
    gets
    !它甚至被从C标准中删除,这是一个非常罕见的事件。
    scanf(“%s”,b)
    =
    得到(b)
    ==一个漏洞,您的用户可能会通过这个漏洞崩溃或控制您的程序。您的问题实际上是“当我实际上不想做scanf所做的事情时,我如何使用scanf”。最好的答案是