c编程:( scanf和gets)

时间:2016-06-01 19:23:09

标签: c string scanf 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()遇到空格,它就会停止读取字符串,因此,剩下的部分就是 string:united,已被赋值给变量b,即使没有程序提示我输入变量b的字符串。

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

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

对于执行代码时发生的事情的任何进一步解释将不胜感激。

对非常基本的错误表示道歉(回复显而易见)!! 只是C编程的新手:)

1 个答案:

答案 0 :(得分:3)

您可以通过手动阅读和丢弃字符来清除它,直到找到'\n'或某人点击相应的组合键以产生EOF。或者你可以要求scanf()丢弃所有内容,直到找到'\n',第二个可以像这样实现

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

您的代码还有其他问题,这是错误的

  1. 您将a声明为20 char的数组,然后将其地址传递给scanf(),其中指向char的指针,即数组名称(变量,如果您愿意)会在必要时自动转换为指向char的指针。

  2. 您使用了gets(),这是一个旧的危险且已弃用的功能,不再是标准功能。您应该使用fgets()代替一个参数来防止溢出目标数组。

  3. 这是测试建议修补程序的示例

    #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;
    }