【问题标题】:Dynamically allocate 2 dimensional array purely using pointers纯粹使用指针动态分配二维数组
【发布时间】:2016-08-06 01:17:57
【问题描述】:

我正在尝试反转字符串中的单词(而不是单词本身)。我正在尝试仅使用指针(不使用数组语法)动态分配二维数组。我的程序编译得很好,但最终只显示一个单词作为输出,并在这里和那里有空格。这是我的代码。

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

void rev(char *x, int n);
int words(char * p);

int main()
{
    char *p = (char *)malloc(101*sizeof(char));
    fgets(p, 101, stdin);
    rev(p, words(p));
    free(p);
    return 0;
}

void rev(char *x, int n)
{
    char **y = (char **)malloc(101*sizeof(char *));
    int i = 0;

    int *j = (int *)calloc(101, sizeof(int));
    *y = (char *)malloc(101*sizeof(char));
    while(*x!='\n')
    {
        if(*x==' ')
        {
            i++;
            *(y+i) = (char *)malloc(101*sizeof(char));
        }
        else
        {

            *(*(y+i)+(*(j+i))) = *x;
            (*(j+i))++;
        }
        x++;
    }
    i++;
    int z, q;
    for(z=i-1; z>0; z--)
    {
        for(q=0; q<(*(j+i)); q++)
        {
            printf("%c", *(*(y+z)+(q)));
        }
        printf(" ");
    }
    for(q=0; q<*j; q++)
    {
        printf("%c", *(*(y)+(q)));
    }
    printf("\n");
    for(q=0; q<i; q++)
    {
        free(y+i);
    }
    free(j);
    free(y);
}

int words(char * p)
{
    int x = 0;
    while(*p!='\n')
    {
        if(*p==' ')
        {
            x++;
        }
        p++;
    }
    return ++x;
}

我只想使用指针算术来做到这一点。我一直在尝试过去 20 个小时,但无法弄清楚。谁能解释这个错误以及如何纠正它? 输入 Hello World 输出

 Hello

输入 This is my input 输出

    This

【问题讨论】:

  • 您的代码中没有二维数组。 char ** 不是二维数组,不能指向一个。指针不是数组,反之亦然。并且不要使用幻数
  • for(q=0; q&lt;i; q++){ free(y+i);}for(q=0; q&lt;i; q++){ free(j+i);} 似乎很糟糕,因为它们使用了无意义的循环,或者多次对同一指针执行 free
  • @MikeCAT 是不是因为这个错误,我没有得到所需的输出?
  • 你有使用数组的工作代码吗?

标签: c arrays pointers multidimensional-array


【解决方案1】:

这是一个非常棘手的问题(反转字符串中的单词)。这个问题的最佳解决方案之一是定义一个函数来反转整个字符串,然后开始逐字读取结果字符串,如果到达空格,再次使用 reverse 函数并打印它。

原始字符串

你好世界

第一步

dlrow olleh

第二步

世界你好

这个解决方案比你复杂的解决方案要容易得多。

这可能是我上面提到的reverse 函数:

void rev(char *word, int len)
{
  char c;
  if(len>1)
  {
    c=word[len-1];
    word[len-1]=word[0];
    word[0]=c;
    rev(word+1, len-2);
  }
  return;
}

【讨论】:

  • 感谢您的新方法
  • @bharadwaj 不客气,如果有帮助,请将我的回答标记为正确
  • 您的方法确实有帮助。事实上,从现在开始我将使用你的方法。但我不能将您的答案标记为正确的答案,因为那不是我问的答案。
  • 没关系,如果您在我的方法方面需要帮助,请再次询问,祝您好运。 @bharadwaj
猜你喜欢
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
相关资源
最近更新 更多