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