繁体   English   中英

c编程:(scanf和gets)

[英]c programming: (scanf and gets)

我知道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字符串“ manchester united”作为输入时,输出为:

                   enter the string
                   manchester united
                   the string is manchester
                   enter the string
                   warning: this program uses gets(), which is unsafe.
                   the string is  united

我期望的输出只是给变量a的字符串的第一部分,即曼彻斯特,然后程序提示我输入变量b的新输入字符串。 相反,我最终得到了上面给出的输出。

根据输出,我了解的是:

可以看出,scanf()遇到空白后,它将立即停止读取字符串,因此,即使程序没有提示我输入,字符串的其余部分:united也已分配给变量b。变量b的字符串。

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

这样,我可以为变量b输入一个全新的输入字符串。

非常感谢您对代码执行中在这里发生的任何进一步的解释。

对于最基本的错误表示歉意(从响应中可以明显看出)! 只是C编程的新手:)

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

char string[20];
scanf("%19s%*[^\n]\n", string);

您的代码还有其他错误

  1. 您将a声明为由20个char的数组,然后将其地址传递给scanf() ,该地址需要char指针,该数组名称( 如果需要,可以使用变量 )会在需要时自动转换为char指针。

  2. 您使用过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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM