2D char数组(将空格键存储在一个char数组元素中吗?)

时间:2019-02-13 13:25:11

标签: c

访问对此post而言,最常用的将文本存储在2D数组中的方法是使用%s方法。但是,这种方法有一个缺点,即每当您按空格键时,键入的文本就会进入数组的第二个元素。例如您输入

输入:-

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

输出:-

char数组的第一个元素= Hi

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

预期输出:-

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

所以,我想问为什么不能使用下面的书面方法将文本输入2D数组?

#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;
}

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

2 个答案:

答案 0 :(得分:1)

您提供的示例中的问题是换行符保留在缓冲区中。您可以通过更改以下内容放弃该前导空白:

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

对此

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

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

  

输入名称:-

     

输入名称0:foo

     

输入名称1:栏

     

输入名称2:baz

     

输入名称3:qux

     

输入的名称0:foo

     

输入名称1:栏

     

输入名称2:baz

     

输入名称3:qux

这是因为%[^\n]指示符告诉它接受换行符的所有内容。因此,换行符将保留在缓冲区中,并且再次调用scanf时,它是缓冲区中的第一件事,因此那些附加的调用不能接受任何输入。

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

这是reference所说的:

  

空白字符:该函数将读取并忽略下一个非空白字符之前遇到的所有空白字符   字符(空格字符包括空格,换行符和制表符   字符-请参见isspace)。格式字符串中的单个空格   验证从中提取的任意数量的空格字符   流(不包含任何流)。

答案 1 :(得分: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]);     
            fflush(stdin);
            printf("\n");   
    }
    for(i=0; i<4; i++)
    {
        printf("Entered name %d: %s", i, name[i]);
        printf("\n");
    }
    return 0;
}