在c中打印一个2d的字符串数组

时间:2013-12-09 10:54:57

标签: c printing multidimensional-array

我正在尝试打印一个二维数组的字符串作为练习(我是一个新手)没有成功我已经尝试了每一个组合我能想到的仍然没有什么我敢肯定我在某处做一个愚蠢的错误我在这里看不到一些例子: 使用指针:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define lim 10
#define maxx 25
void print(char *);
int main()
{
    int i = 1;
    char input[lim][maxx];
    char *ps = input;
    printf("type the list of %d names or type quit to leave \n", lim);

    while (i<lim && gets(input[i]) != NULL && strncmp(input[i], "quit", 4)!=0 ) {
      i++;   
    }
    printf("i've counted %d names\n", i);
    print("\n");
    print(ps);

    return 0;
}
void print(char *a)  
{
  int i=0;
  printf("the list of names include : \n");
  while(*(a) != '\0') {
    printf("%s\n", *(a+i));
    i++;
  }
}

这是输出:

type a list of %d names or type quit to leave :
bla
bli
blo
quit
i've counted 4 names
the list of names include :
segmentation fault (core duped)

另一个版本的打印功能是这样的:

void print(char aray[lim][maxx])  
{
  int i,j;
  printf("the list of names include : \n");
  for(i = 0; i < lim; i++) {
    for(j = 0; j < maxx; j++){
      puts(aray[i][j]);
            //printf("%s\n", aray[i][j]);
    }
  }
}

我得到相同的输出,任何人都可以帮我调试吗?和thx提前

4 个答案:

答案 0 :(得分:2)

你正在添加i为1,这对你的二维数组没有帮助,因为下一个元素将位于maxx位置,所以你可以这样做 //此处lim和max在您的程序中定义

void print(char *a){

    int i=0;
    printf("the list of names include : \n");
    while(i<(lim*maxx)){
        printf("%s\n",a );
        i += maxx;
        a = a + maxx;
    }
}

并且第二个变体应该是

void print(char aray[lim][maxx])  
{
  int i,j;
  printf("the list of names include : \n");
  for(i = 0; i < lim; i++) {
    cout<<aray[i]<<"\n";
  }
}

答案 1 :(得分:2)

简而言之,看起来你需要了解你的指针。使用原始打印功能:

void print(char *a)  
{
  int i=0;
  printf("the list of names include : \n");
  while(*(a) != '\0') {
    printf("%s\n", *(a+i));
    i++;
  }
}

每次迭代都会在+ i处打印值。这可能听起来像你想要的那样,但你实际传递给print的是指向char数组数组的指针(你的编译器应该抛出关于不兼容指针类型的警告)。也就是说,ps的“正确”类型是(char *)[]。所以在print函数中,每次迭代只能通过sizeof(char)推进内存地址,而实际需要的是通过sizeof(char)* maxx(数组条目的大小)递增它。要实施此更改,请执行以下操作:

  1. 更改print的声明
    • void print(char (*)[maxx]);
  2. 更改为正确的指针类型
    • char (*ps)[maxx] = input;
  3. 最后,将打印功能更改为:

    void print(char (*a)[maxx]){
        printf("the list of names include : \n");
        int i;
        for (i = 0; i < lim; i++){
            printf("%s\n",*a);
            a++;
        }
    }
    

    你不需要使用(a + i)语法,因为每次迭代只需逐个推进即可完成同样的事情,对于大型i来说可能更快。当然,正如其他人提到的那样,仔细检查你的新行打印,我相信你想要printf('\n')

答案 2 :(得分:1)

从2d数组中的索引1开始,应该从索引0开始

int i=1;

你的print函数接受一个字符数组,然后每个字符的printf字符串都没有意义

void print(char *a)
{
  int i=0;
  printf("the list of names include : \n");
  while(*(a)!='\0')
  {
    printf("%s\n",*(a+i));
    i++;
  }
}

而是让它看起来像这样

void print(char *a[], int strings)
{
  int i = 0;
  for (; i < strings; ++i)
  {
    puts( a[i] );
  }
}

并使用您阅读的字符串数量调用

print(ps,i);

你最好还是使用fgets()而不是gets(),特别是因为你的字符串是最多25个字符,所以很容易给出一个更长的字符串。 fgets()允许您指定字符串fgets(input[i],maxx,stdin)

的最大大小

您的其他功能

void print(char aray[lim][maxx])  
{
  int i,j;
  printf("the list of names include : \n");
  for(i = 0; i < lim; i++) {
    for(j = 0; j < maxx; j++){
      puts(aray[i][j]);
        //printf("%s\n", aray[i][j]);
    }
  }
}

对间接水平做了类似的错误假设

arra [i] [j]是一个字符但是puts接受一个字符串参数,所以puts(arra [i] [j]);不正确,您可以尝试fputc( arra[i][j], stdout ),因为fputc需要一个字符

答案 3 :(得分:1)

修复

void print(char (*)[maxx]);
int main()
{
    int i = 0;//int i = 1;
    char input[lim][maxx] = { {'\0'}};
    char (*ps)[maxx] = input;
    printf("type the list of %d names or type quit to leave \n", lim);

    while (i<lim && gets(input[i]) != NULL && strncmp(input[i], "quit", 4)!=0 ) {
      i++;   
    }
    printf("i've counted %d names\n", i);
    printf("\n");//print("\n");
    print(ps);

    return 0;
}
void print(char (*a)[maxx])
{
  int i=0;
  printf("the list of names include : \n");
  while(i<lim && a[i][0] != '\0') {
    printf("%s\n", a[i]);
    i++;
  }
}