【问题标题】:Two char array getting inputs with spaces one by one两个字符数组一一获取带有空格的输入
【发布时间】:2021-10-23 23:05:00
【问题描述】:

输入: 输入姓名:Arun kumar 输入txt:我擅长编程!我想!

我只是尝试获取名称和文本。喜欢,

char *ch[2]; \\I tried changing it to char ch[20] for name and 
ch[100] for text
printf("Enter name:");
fgets(ch[0],20,stdin);
printf("Enter text:");
fgets(ch[1],100,stdin);

但它不能正常工作。代码在运行程序时停止工作。还建议最好的方法。

【问题讨论】:

  • 试试char ch[2][100]; 如果你想把两个字符串放在同一个(2D)数组中,那么它们的大小必须相同(最大)。
  • 是的,当我尝试作为单独的代码时它工作正常。
  • 但是当我使用插入代码时,它直接用于第二个 fgets 为什么!
  • 目前还不清楚您要问什么,以及您的预期输出和所需的程序结构应该是什么。请尝试澄清问题,并提供Minimal, Reproducible Example
  • char *ch 2 是两个指向未初始化内存的指针;将它们传递给 fgets 会导致未定义的行为。 Otoh,char ch 2 100 导致更多空间被保留; fgets 使用空格来填充输入。

标签: arrays c string char fgets


【解决方案1】:

我假设目标是创建一个包含两个长度不等的字符串的数组。这个“数组的数组”不能直接声明,但是有两种方法可以完成同样的事情:

  • 声明两个静态数组,然后将一个指向每个数组的指针复制到一个包含 2 个元素的新数组中。不建议这样做,因为您也可以直接使用指针(这很好)并避免与 restrict 关键字或严格别名有关的潜在问题。

  • 为每个数组使用动态内存分配。

#include <stdio.h>
#include <stdlib.h>

void staticMemoryAndAlias()
{
    char ch0[20];
    char ch1[100];

    char *ch[2] = {ch0, ch1};

    printf("Enter name: ");
    fgets(ch[0], 20U, stdin);
    printf("Enter text:");
    fgets(ch[1], 100U, stdin);

    printf("Name: %s", ch[0]);
    printf("Text: %s", ch[1]);
}

void dynamicMemoryAllocation()
{
    size_t const chSize0 = 20U;
    size_t const chSize1 = 100U;

    char *ch[2];
    ch[0] = (char*) malloc(chSize0);
    if (ch[0] == NULL)
        exit(EXIT_FAILURE);
    ch[1] = (char*) malloc(chSize1);
    if (ch[1] == NULL)
    {
        free(ch[0]);
        exit(EXIT_FAILURE);
    }

    printf("Enter name: ");
    fgets(ch[0], chSize0, stdin);
    printf("Enter text:");
    fgets(ch[1], chSize0, stdin);

    printf("Name: %s", ch[0]);
    printf("Text: %s", ch[1]);

    free(ch[0]);
    free(ch[1]);
}

int main(void)
{
    staticMemoryAndAlias();
    dynamicMemoryAllocation();
}

什么是“最好的”取决于更大的背景。缓冲区需要多大?您想如何处理大于缓冲区大小的输入?整个字符串是否需要保留在内存中,还是我们只会提取一些信息以进行进一步的解析/处理?等等。

鉴于您的代码 sn-p 和(小)示例输入,我可能会从单独的静态缓冲区开始并根据上下文扩展代码:

char ch0[20];
printf("Enter name: ");
fgets(ch0, 20U, stdin);

printf("Enter text:");
char ch1[100];
fgets(ch1, 100U, stdin);

printf("Name: %s", ch0);
printf("Text: %s", ch1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2015-11-13
    • 2016-02-23
    • 1970-01-01
    • 2020-08-30
    • 2016-04-30
    • 2015-05-09
    相关资源
    最近更新 更多