第二个字符串未被扫描 #包括 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); }
问题是您按Enter键,第二个字符串未被扫描 #包括 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
'\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);