纯粹使用指针

时间:2016-04-14 12:59:49

标签: c arrays pointers multidimensional-array

我试图扭转字符串的单词(而不是单词本身)。我试图仅使用指针动态分配2维数组(不使用数组语法)。我的程序编译得很好,但最终只显示一个单词作为输出,其中包含空格。这是我的代码。

#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

1 个答案:

答案 0 :(得分:1)

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

原始字符串

  

你好世界

第一步

  

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