【问题标题】:Two Dimensional Array of Characters in CC中的二维字符数组
【发布时间】:2013-07-04 09:21:49
【问题描述】:

帮助我摆脱这个问题。我在 ubuntu12.04 上使用 GCC。当我编写这个程序从键盘 n 获取 5 个字符串然后在屏幕上打印这些字符串时。程序已编译但在执行期间它从键盘获取字符串但仅打印最后一个字符串。我写的程序如下:

void main()    
{  
    char names[10];  
    int i,j;

    for(i=0;i<5;i++)  
    {  
        printf(" Enter a name which you want to register\n");  
        scanf("%s",names);  
    }  
    for(i=0;i<5;i++)    
        printf(" the names you enter are %s\n", names);  

}

【问题讨论】:

  • 二维数组是数组的数组。想一想。
  • 你的代码中只有一个可以包含 10 个字符的数组
  • 其实我是编程初学者。所以不要介意我的问题是否太疯狂或太蹩脚......

标签: c c-strings


【解决方案1】:

1) 你可以这样使用二维字符数组

char names[5][100];

二维数组中的每一行都是一个大小为 100 的 char 数组

for(i=0;i<5;i++)  
{
    printf(" Enter a name which you want to register\n");  
    scanf("%99s",names[i]);
}

2) 你可以这样使用指针数组

char *names[5];

数组中的每个元素都是一个指向字符串(char 数组)的指针。在调用scanf()之前,您必须将数组中的每个指针分配给内存空间

for(i=0;i<5;i++)  
{
    names[i]=malloc(100);  
    printf(" Enter a name which you want to register\n");  
    scanf("%99s",names[i]);
}

3) 如果您使用 gcc 版本 >2.7 进行编译,那么您的 scanf() 可以使用 "%ms" 而不是 "%s" 来分配内存

char *names[5];
for(i=0;i<5;i++)  
{
    printf(" Enter a name which you want to register\n");  
    scanf("%ms",&names[i]);
}

【讨论】:

  • 我觉得有错别字?在名字后加“s”?
【解决方案2】:

有一个关于在char数组中读取和保存字符串的简单示例。

#include <stdio.h>

const int MACRO = 6;

int main() {
  printf("Hello Admin Please Enter the  Items:\n");

  char items[MACRO][20];

  for (int i = 0; i < MACRO; ++i) {
    scanf("%19s", items[i]);

  }

  for (int i = 0; i < MACRO; ++i) {
    printf("%s ", items[i]);
  }

  return 0;
}

【讨论】:

    【解决方案3】:

    在您的程序中,错误是您没有将运算符的“&”地址放入第一个 for 循环中。如果您将 %s 字符串存储在名称中而不是 &names[0] 或 &names[1] 等,则在您的情况下,名称是一个数组,因为数组本身充当指针,因此数组“名称”指向其地址第一个元素,即 names[0] 。所以如果你正在写 scanf("%s",names);这类似于 scanf("%s",&names[0]);因此,您仅将名称存储在一个元素中,并且对于 5 次迭代,只有您输入的最后一个字符串将被存储,并且以前的字符串将消失。所以只有最后一个字符串会打印在你的程序中。

    【讨论】:

      【解决方案4】:

      在您的代码中,您仅将 char 数据类型声明为一维,因此它将始终覆盖先前的输入,这就是结果是最后一个输入打印 5 次的原因。

      char names[10];
      

      上面的声明意味着你只声明了一个 10 个字符大小的 char 类型变量,没有额外的数组,这意味着你只声明了一个 5 个输入的变量。

      要制作二维字符,您需要像这样声明它:

      char names[5][10];
      

      在上面的代码中,这意味着你在一个 5 的数组中声明了一个 10 个字符大小的 char 类型变量。

      【讨论】:

        【解决方案5】:

        这是我使用指针编写的代码。

        #include <stdio.h>
        void main()
        {
           char *string[100];
           int ln;
        
           printf("Enter numbar of lines: ");
           scanf("%d",&ln);
           printf("\n");
           for(int x=0;x<ln;x++)
           {    
             printf("Enter line no - %d ",(x+1));
             scanf("%ms",&string[x]);  // I am using gcc to compile file, that's why using %ms to allocate memory.              
           }
           printf("\n\n");
           for(int x=0;x<ln;x++)
           {            
             printf("Line No %d - %s \n",(x+1),string[x]);  
           }
        
        }   
        

        另一个使用二维数组的代码

            #include <stdio.h>
        
            void main()
            {
        
            int ln;
        
            printf("Enter numbar of lines: ");
            scanf("%d",&ln);
            printf("\n");
        
            char string[ln][10];
        
            for(int x=0;x<ln;x++){
                printf("Enter line no - %d ",(x+1));
                scanf("%s",&string[x][0]);
            }
        
        
            for(int x=0;x<ln;x++)
            {           
                printf("Line No %d - %s \n",(x+1),string[x]);   
            }
        
        
        
        }   
        

        【讨论】:

        • 我建议解释一下你做了什么以及为什么。仅代码答案往往只会使提问者的复制和粘贴技能略有提高。
        • 我试图在第二个例子中解释二维字符数组,我们也可以使用'C'中的指针来实现相同的结果。请看代码。其实我也面临同样的问题,我就是这样做的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        • 2016-04-04
        • 2014-12-21
        相关资源
        最近更新 更多