我想输入一个带空格的字符串,然后在同一行打印该字符串和另一个字符串。
int i = 4;
double d = 4.0;
char s[] = "Apple ";
int x;
double y;
char z[105];
scanf("%d",&x);
scanf("%lf",&y);
scanf("%[^105\n]s",z);
printf("%d\n",i+x);
printf("%0.1lf\n",d+y);
printf("%s %s",s,z);
return 0;
最佳答案
你 scanf
格式说明符 "%[^105]s"
使用字符类 [...]
它本身就是一个独立的说明符,不需要 's'
在最后。通过放置 's'
最后你强制scanf
寻找文字 's'
后面的字符数量不受限制,不包括 1, 0, 5
.
您似乎打算使用数字来保护您的数组边界——这是一件好事,但在这种情况下正确的格式是 "%104[^\n]"
这将读到 104
不包含 '\n'
的字符(为 空字符 保留空间)。
例如:
if (scanf("%104[^\n]",z) == 1)
printf("%s %s\n",s,z);
(注意:始终至少通过检查返回来验证所有用户输入)
另请注意:不要阅读 '\n'
上面,它留在你的输入缓冲区(stdin
)未读,如果你的下一个尝试输入是"%c"
或 "%[...]"
, 你将乘坐 '\n'
作为下界输入的一部分 "%c"
或 `"%[...]"消耗前导空格。
把它放在一个你可以做的例子中:
#include <stdio.h>
int main (void) {
char s[] = "Apple";
char z[105];
printf ("enter z: ");
if (scanf("%104[^\n]",z) == 1)
printf("%s %s\n",s,z);
else
fputs ("error: stream error or user canceled.\n", stderr);
return 0;
}
(注意:代替scanf
来读取行,建议使用fgets()
,然后简单地修剪包含在填充缓冲区中的'\n'
)
示例使用/输出
$ ./bin/oneline
enter z: is a fruit
Apple is a fruit
使用 fgets()
相反
而不是使用 scanf
对于行输入,使用面向行的输入函数,如fgets()
这将消耗整行(包括行尾)。确保您的输入缓冲区保持一致状态,不依赖于先前的格式说明符用户,例如
...
#include <string.h>
...
printf ("enter z: ");
if (fgets (z, sizeof z, stdin) != NULL) {
z[strcspn (z, "\n")] = 0; /* trim '\n' from end of z */
printf("%s %s\n",s,z);
}
在评论中编辑每个问题
您的新代码的问题是 scanf("%lf",&y);
离开 '\n'
在 stdin
未读,然后您尝试阅读 scanf("%[^105\n]",z);
显示为nothing 因为您排除了阅读 '\n'
在 inverted character class 然后你读到 stdin
作为输入,其中第一个字符 是'\n'
. "%[^105\n]"
意思是:读取无限数量的字符,只有在出现 1, 0, 5
时才停止读取或 '\n'
遇到字符(或 EOF
)。
使用 scanf
进行混合输入由于 stdin
中遗留的内容,对于新 C 程序员来说充满了陷阱 ,以及如何处理前导空格取决于所使用的格式说明符。这就是为什么 fgets()
(或 POSIX getline()
)被推荐用于用户输入,然后使用 sscanf
从填充的缓冲区中解析所需的信息。 .使用面向行的输入函数,每个输入都完全消耗该行(给定足够的缓冲区大小——不要吝啬),消除了 scanf
的问题。 .
要使您当前的代码正常工作,您可以:
#include <stdio.h>
/* simple function to empty remainder of line in stdin */
void empty_stdin (void)
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
int main (void) {
int i = 4, x;
double d = 4.0, y;
char s[] = "Apple ", z[105];
scanf("%d",&x);
scanf("%lf",&y); /* leaves '\n' as next char in stdin */
empty_stdin(); /* empty extraneous characters */
scanf("%104[^\n]",z); /* read up to 104 chars, \n, or EOF */
printf("%d\n",i+x);
printf("%0.1lf\n",d+y);
printf("%s %s\n",s,z);
return 0;
}
(验证对 scanf
的每次调用——留给你)
如果您还有其他问题,请告诉我。
关于c - 如何在c中的同一行上打印两个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56708033/