第二个字符串未被扫描 #包括 void main() { char-str1[100]; char-str2[100]; printf(“\n输入第一个字符串\n”); scanf(“%[^\n]s”,str1); printf(“输入第二个字符串”); scanf(“%[^\n]s”,str2); printf(“\n字符串是%s%d\n”,str1,i); }

第二个字符串未被扫描 #包括 void main() { char-str1[100]; char-str2[100]; printf(“\n输入第一个字符串\n”); scanf(“%[^\n]s”,str1); printf(“输入第二个字符串”); scanf(“%[^\n]s”,str2); printf(“\n字符串是%s%d\n”,str1,i); },c,string,scanf,c-strings,C,String,Scanf,C Strings,问题是您按Enter键,'\n'保持在stdin中,它在第二个scanf()中作为字符串使用 您可以在两个scanf()之间放置一个虚拟getchar()。这将解决问题,因为它将使用前一个scanf未使用的'\n' 你说你在读一个单词的方式——你基本上是在读由“\n”分隔的行 更好的方法是使用fgets()。它提供两种方式,一种是解决\n消耗问题,另一种是fgets()将读取一行,并提供比scanf()更好的控制 “第二个字符串未被扫描” 不。不是这样,它正在从您输入的上一行读取\n 关于fge

问题是您按Enter键,
'\n'
保持在
stdin
中,它在第二个
scanf()
中作为字符串使用

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

你说你在读一个
单词的方式
——你基本上是在读由
“\n”
分隔的行

更好的方法是使用
fgets()
。它提供两种方式,一种是解决
\n
消耗问题,另一种是
fgets()
将读取一行,并提供比
scanf()更好的控制

“第二个字符串未被扫描” 不。不是这样,它正在从您输入的上一行读取
\n

关于
fgets
,您还应该了解一些事情。它还将使用
\n
。因此,字符串将包含
\n
字符。如果你不想这样,你可以这样做

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

fgets
函数读取的数据最多比 由
n
流指向的流中指定的字符
进入
s
指向的数组。不读取其他字符 在新行字符(保留)之后或在文件结尾之后。A. 在最后一次读取字符后立即写入空字符 进入阵列

还要检查
fgets()
的返回值,以了解它是否成功。 如果遇到(EOF)文件结尾且未读取任何字符,
fgets
返回
NULL
。 因此,代码将是

char *fgets(char * restrict s, int n, FILE * restrict stream);
因此,您可以在这里输入字符串,但同时输入
\n
。如果呼叫成功,我们将覆盖它

if( fgets(str1, 100, stdin) ){
  // successfully read the string.
  str1[strcspn(str1,"\n")]='\0'; ///removing `'\n'`

}
#包括
#包括
#定义MAXLEN 100
int main()
{
字符str1[MAXLEN];
字符str2[MAXLEN];
printf(“\n输入第一行\n”);
if(fgets(str1、MAXLEN、stdin)){
str1[strcspn(str1,“\n”)]='\0';
}
否则{
fprintf(标准“未读行”);
退出(退出失败);
}
printf(“\n输入第二行\n”);
if(fgets(str2、MAXLEN、stdin)){
str2[strcspn(str2,“\n”)]='\0';
}   
否则{
fprintf(标准“未读行”);
退出(退出失败);
} 
printf(“\n字符串是\n(%s)\n%s\n”、str1、str2);
返回退出成功;
}

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

#include<stdio.h>
#include<string.h>
#define MAXLEN 100
int main()    
{

  char str1[MAXLEN];    
  char str2[MAXLEN];

  printf("\n Enter the first line\n");    
  if( fgets(str1,MAXLEN,stdin) ){
     str1[strcspn(str1,"\n")]='\0';
  }
  else {
     fprintf(stderr,"Line not read");
     exit(EXIT_FAILURE);
  }

  printf("\n Enter the second line\n");
  if( fgets(str2,MAXLEN,stdin) ){
     str2[strcspn(str2,"\n")]='\0';
  }   
  else {
     fprintf(stderr,"Line not read");
     exit(EXIT_FAILURE);
  } 

  printf("\n The strings are \n(%s)  \n%s \n",str1,str2);  
  return EXIT_SUCCESS;   
}
请注意,尾随的
\n
仍在字符串中(如果它们的最大长度为98个字符)


第一次扫描后添加fflush(标准输出)不工作!您认为为什么会发生这种情况?您提供给scanf的格式是问题所在。仅使用
%s
将处理不包含空格的字符串,如手册页所述:
s-匹配一系列非空格字符;下一个指针必须是指向字符数组的初始元素的指针,该元素的长度足以容纳输入序列和自动添加的终止空字节('\0')。输入字符串在空白处或在最大字段宽度处停止,以先出现的为准。
如果我使用fgets扫描字符串,长度将比原始长度多一倍!请帮助。明白了。偶数\n将作为字符添加。
#include<stdio.h>
#include<string.h>
#define MAXLEN 100
int main()    
{

  char str1[MAXLEN];    
  char str2[MAXLEN];

  printf("\n Enter the first line\n");    
  if( fgets(str1,MAXLEN,stdin) ){
     str1[strcspn(str1,"\n")]='\0';
  }
  else {
     fprintf(stderr,"Line not read");
     exit(EXIT_FAILURE);
  }

  printf("\n Enter the second line\n");
  if( fgets(str2,MAXLEN,stdin) ){
     str2[strcspn(str2,"\n")]='\0';
  }   
  else {
     fprintf(stderr,"Line not read");
     exit(EXIT_FAILURE);
  } 

  printf("\n The strings are \n(%s)  \n%s \n",str1,str2);  
  return EXIT_SUCCESS;   
}
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);