第二个字符串没有被扫描

时间:2017-11-23 06:27:20

标签: c string scanf c-strings

#include<stdio.h>

void main()    
{

  char str1[100];    
  char str2[100];

  printf("\n Enter the first String\n");    
  scanf("%[^\n]s",str1);

  printf("Enter the second String");    
  scanf("%[^\n]s",str2);  

  printf("\n The strings are %s  %d \n",str1,i);     
}

2 个答案:

答案 0 :(得分:1)

由于您想阅读整行,请使用fgets。至少你可以控制字符串长度输入,而不需要处理scanf特性

printf("\n Enter the first String\n");    
fgets(str1, 100, stdin);

printf("Enter the second String");    
fgets(str2, 100, stdin);

printf("\n The strings are %s  %s \n",str1,str2);    

请注意,尾随\n仍在字符串中(如果它们最长为98个字符)。

Worth reading - scanf vs fgets

答案 1 :(得分:0)

嗯,你要按 Enter RequestData保留在'\n'中,在第二个stdin中作为字符串使用。

您可以在两个scanf()之间放置一个虚拟getchar()。这样可以解决问题,因为它会消耗前scanf()未使用的'\n'

你说你正在阅读scanf的方式 - 你基本上是在阅读由word分隔的行。

更好的方法是使用'\n'。它有两种方式可以解决fgets()消费问题,另一方面是\n会读取一行,并提供比fgets()更好的控制。

&#34;第二个字符串未被扫描&#34;

没有。情况并非如此,它是从您输入的上一行读取scanf()

关于\n,您应该了解的一些事情。它也会消耗fgets。因此,您的字符串将包含\n字符。如果您不想要,那么您可以这样做

\n
str[strcspn(str,"\n")]='\0'
  

char *fgets(char * restrict s, int n, FILE * restrict stream); 函数最多读取的数量少于1   由fgets指向的流n指定的字符   进入stream指向的数组。不会读取其他字符   在换行符后(保留)或文件结束后。一个   在最后一个字符读取后立即写入空字符   进入阵列。

同时检查s的返回值以了解其是否成功。 如果遇到(EOF)文件结尾且未读取任何字符,fgets()将返回fgets。 所以代码将是

NULL

所以在这里你可以输入字符串,但同时输入if( fgets(str1, 100, stdin) ){ // successfully read the string. str1[strcspn(str1,"\n")]='\0'; ///removing `'\n'` } 。如果通话成功,我们会覆盖它。

\n