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

标签 c string

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

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/

相关文章:

Python 在某一点切割字符串

java - 摩尔斯转英语程序中的 Java 输出不正确

计数参数不一致,MPI_Bsend/MPI_Recieve

C 从字符串的前 15 个字符中获取完整的单词

c - 从c程序构建可执行程序

C 中的字符数组

PHP 字符串操作 : Append html class to a string

c - 在 log(n) 时间内移动数组中的元素

c - 测试位板是否只有一位设置为 1

c++ - 纯 C++ 中的 Unicode 字符串