【问题标题】:2D char array (Storing text with the spacebar in an one char array element?)二维字符数组(将带有空格键的文本存储在一个字符数组元素中?)
【发布时间】:2019-07-07 08:28:29
【问题描述】:

累加。对于这个post,将文本存储在二维数组中的最常用方法是使用 %s 方法。但是,这种方法有一个缺点,即每当您按空格键时,键入的文本会进入数组的第二个元素。例如你输入了

输入:-

char 数组的第一个元素 = 大家好

输出:-

char 数组的第一个元素 = Hi

char 数组的第二个元素 = 每个人

预期输出:-

char 数组的第一个元素 = 大家好

所以,我想问一下为什么不能使用下面的书面方法将文本输入到二维数组中?

#include <stdio.h>
int main()
{
     char ch[20];
     printf("Enter name:");  
     scanf("%19[^\n]", ch);
     printf("Your name is: %s", ch);
     return 0;
}

如果上述方法可以使用,请告诉我如何使用?

请不要在回答这篇文章时引入指针概念/代码。这是一个理解上述书面方法为何失败的问题。

将此视为失败的代码:-

#include <stdio.h>

int main()
{
    char name[4][20];
    int i;
    printf("Enter names:-\n");
    for(i=0; i<4; i++)
    {
            printf("Enter name %d: ", i);
            scanf("%19[^\n]", name[i]);
            printf("\n");   
    }
    for(i=0; i<4; i++)
    {
        printf("Entered name %d: %s", i, name[i]);
        printf("\n");
    }
    return 0;
}

上述程序编译时没有任何错误或警告,但在运行时失败。

【问题讨论】:

  • 对于例如的输入Hi everyone,结果应该是什么?如果你有你的“2D”数组,它应该是什么样子,输入后它的内容应该是什么?
  • “这是一个理解为什么上面写的方法失败的问题。” 它没有失败(至少对我来说没有),也不是二维数组。如果它没有按照您的预期工作,则需要更详细的问题描述。
  • @Someprogrammerdude 检查帖子,更新它。
  • @Gahlot,如果您想使用 0ne scanf 函数将“大家好”转换为“hi”和“每个人”在单独的字符串中的二维,那么它是可行的:char ch [2] [ 20]; scanf("%s %19[^\n]", ch[0], ch[1]);但不建议这样做,因为它可能会根据输入溢出数组。
  • 此外,如果您想阅读 lines,为什么不使用 fgets 代替呢?如fgets(name[i], sizeof name[i], stdin);

标签: c arrays multidimensional-array scanf


【解决方案1】:

您提供的示例中的问题是换行符留在缓冲区中。你可以通过改变这个来丢弃这个前导空格:

scanf("%19[^\n]", &name[i]);

到这里

scanf(" %19[^\n]", &name[i]);

注意%19 之前的空格。这样,您的程序将打印:

输入姓名:-

输入名称0:foo

输入名称 1:bar

输入名字2:baz

输入名称 3:qux

输入名称 0:foo

输入名称 1:bar

输入名称 2:baz

输入名称 3:qux

这是因为%[^\n] 说明符告诉它获取所有内容换行符。所以换行符会留在缓冲区中,当再次调用scanf时,它是缓冲区中的第一件事,所以那些额外的调用不能接受任何输入。

scanf 中的前导空格解决了这个问题,因为它告诉scanf 丢弃任何尾随空格,包括留在缓冲区中的换行符。

reference 是这么说的:

空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符 字符(空白字符包括空格、换行符和制表符 字符——见 isspace)。格式字符串中的单个空格 验证从 流(包括无)。

【讨论】:

  • 输入名称:- 输入名称 0:dss dsfsd 输入名称 1:sdfs dsfsd 输入名称 2:sfs sdfs dsfsd 输入名称 3:dsfs sdfsdf fss f 输入名称 0:dss dsfsd 输入名称 1:sdfs dsfsd 输入名称 2:sfs sdfs dsfsd 输入名称 3:dsfs sdfsdf fss f 好的,这行得通。但是为什么特别需要前导空格。
  • 您可能应该添加一个注释,即%[ 格式说明符不会跳过前导空格(如上一次调用留下的换行符)。
  • @blaze 您的解决方案有效,但您能解释一下为什么需要前导空格吗??
  • @Gahlot 我对此添加了解释
  • @Blaze 是的,谢谢。今天学到了一个新东西!
【解决方案2】:

想出了另一种方法来完成它。

#include <stdio.h>

int main()
{
    char name[4][20];
    int i;
    printf("Enter names:-\n");
    for(i=0; i<4; i++)
    {
            printf("Enter name %d: ", i);
            scanf("%19[^\n]", name[i]);     
            fflush(stdin);
            printf("\n");   
    }
    for(i=0; i<4; i++)
    {
        printf("Entered name %d: %s", i, name[i]);
        printf("\n");
    }
    return 0;
}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多