gpt4 book ai didi

c - 如何在c中的同一行上打印两个字符串

转载 作者:太空狗 更新时间:2023-10-29 15:37:18 28 4
gpt4 key购买 nike

我想输入一个带空格的字符串,然后在同一行打印该字符串和另一个字符串。

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com