c语言 - 未扫描第二个字符串


#include<stdio.h>
void main()    
{
char str1[100];    
char str2[100];
printf("n Enter the first Stringn");    
scanf("%[^n]s",str1);
printf("Enter the second String");    
scanf("%[^n]s",str2);  
printf("n The strings are %s  %d n",str1,i);     
}

由于要读取整行,请使用fgets.至少您可以控制字符串长度输入,无需处理scanf特殊性

printf("n Enter the first Stringn");    
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 个字符)。

值得一读 - 斯堪夫与费吉特

问题是你按Enter并且'n'保留在stdin中,它在第二scanf()中作为字符串使用。

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

你说你正在阅读word的方式 - 你基本上是在阅读由'n'分隔的行.

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

"第二个字符串未被扫描">

不。事实并非如此,它正在读取您输入的上一行中的n

关于fgets,你应该知道的几件事。它也会消耗n。因此,您的字符串将包含n作为字符。如果您不想这样做,那么您可以这样做

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

char *fgets(char * restrict s, int n, FILE * restrict stream);

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

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

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

所以在这里你可以输入字符串,但连同那个n.如果调用成功,我们将覆盖它。

#include<stdio.h>
#include<string.h>
#define MAXLEN 100
int main()    
{
char str1[MAXLEN];    
char str2[MAXLEN];
printf("n Enter the first linen");    
if( fgets(str1,MAXLEN,stdin) ){
str1[strcspn(str1,"n")]='';
}
else {
fprintf(stderr,"Line not read");
exit(EXIT_FAILURE);
}
printf("n Enter the second linen");
if( fgets(str2,MAXLEN,stdin) ){
str2[strcspn(str2,"n")]='';
}   
else {
fprintf(stderr,"Line not read");
exit(EXIT_FAILURE);
} 
printf("n The strings are n(%s)  n%s n",str1,str2);  
return EXIT_SUCCESS;   
}

相关内容

最新更新