为什么%s在遇到空格字符后不打印字符串?

时间:2017-01-26 17:41:38

标签: c

#include <stdio.h>
int main()
{
char name[20];
printf("Enter name: ");
scanf("%s", name);
printf("Your name is %s.", name);
return 0;
}

输出:

输入姓名:Dennis Ritchie 你的名字是丹尼斯。

到目前为止,我还没有找到任何具体的理由来解决这个问题。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

scanf只有在第一个空格之后才能读到空间,这就是为什么它没有存储,所以你的printf函数没有错误,scanf不是存储完整的字符串,在遇到第一个空格时停止。

除非他们完全知道他们在做什么,否则永远不应该使用gets(),因为它没有缓冲区溢出保护,它会在缓冲区结束后继续读取,直到找到新行或遇到EOF。您可以详细了解here。请查看Why is the gets function so dangerous that it should not be used?

您应该使用fgets()

    #include <stdio.h>
    int main(){

           char name[20];
           printf("Enter name: ");
           fgets(name,20,stdin);
           printf("Your name is %s.", name);
            return 0;
         }

记住fgets()也会读取换行符(按Enter键时得到的那个),所以你应该手动删除它。

另外,我强烈推荐这个answer来充分利用fgets()并避免常见的陷阱。

这个answer讲述了使用scanf读取字符串。它说的是:

   int main(){ 
      char string[100], c;
      int i;
      printf("Enter the string: ");
      scanf("%s", string);
      i = strlen(string);      // length of user input till first space
     do{          
        scanf("%c", &c);
        string[i++] = c;  // reading characters after first space (including it)
       }while (c != '\n');     // until user hits Enter

       string[i - 1] = 0;       // string terminating
       return 0;
     }
  
    

这是如何运作的?当用户从标准输入中输入字符时,它们将存储在字符串变量中,直到第一个空格。之后,其余的条目将保留在输入流中,并等待下一个scanf。接下来,我们有一个for循环,它从输入流中获取char(直到\n)并将它们附加到字符串变量的结尾,从而形成一个与键盘用户输入相同的完整字符串。