【问题标题】:Function to reverse a two-dimensional set of strings in C isn't reversing more than the first and last characters在 C 中反转一组二维字符串的函数不会反转超过第一个和最后一个字符
【发布时间】:2018-02-11 05:25:42
【问题描述】:

这是我在 Stack Overflow 上的第一篇文章。如果我遗漏了什么,请告诉我,我会尝试添加更多信息。

下面的函数应该只使用指针操作而不是数组操作,作为赋值的一部分。

我在 C 语言中有这个函数,它是一个更大程序的一部分:

void reverseString(char strings[NUM_STRINGS][STRING_LENGTH])
{
    int i, j;
    char *ptr;                              //Declare pointer variable.
    for (i = 0; i < NUM_STRINGS; i++)
    {
        ptr = strings[i];
        do {                                //Here, we ignore the null terminators in the char array.
            ptr++;
        } while (*ptr != '\0');
        ptr--;                              //Iterate the pointer variable once downward.
        j = i;

        while (strings[j] < ptr)            //While loop for reversing the string
        {
            //printf("ptr: %d\n", ptr);
            //printf("strings[j]: %d\n", strings[j]);
            char temp = *strings[j];
            *strings[j++] = *ptr;
            *ptr-- = temp;
        }
    }
}

它应该做的是接受一个包含 4 个字符串的 2D 字符数组,每个字符串最多包含 32 个字节的文本。然后,它在数组中就地反转每个字符串。比如我输入四个字符串:

你好 世界 好的 早上

它应该然后返回:

olleH 深度学习 杜格 侏儒

但是,最终发生的情况是,只有每个字符串的第一个和最后一个字符被颠倒了。例如:

oellH 多尔W 杜格 呸呸呸

我尝试了不同的解决方案,例如在 while 循环中使用 i 代替 j 或使用前缀 ++ 代替后缀,但没有任何效果。关于我应该寻找什么的任何指示?

谢谢。

【问题讨论】:

  • 假设j 为0。然后strings[j] 指向“你好”。当你增加j 时,strings[j] 指向“世界”。那就是问题所在。您有一个指向字符串末尾的字符指针ptr。您需要另一个指向字符串开头的 char 指针。
  • 啊啊,非常感谢!你答对了。我添加了第二个指针,而不是使用 strings[j],这一次它工作得很好。再次感谢你!我将使用解决方案编辑我的帖子。
  • 干得好!您可以将编辑发布为答案,然后接受它。这是表明问题已解决的首选方法。
  • 请注意,如果处理空字符串,do { ptr++; } while (…) 循环将会(或至少可能)遇到重大问题。您跳过了空终止符,并且您不知道在那之后您正在访问什么。你真的很喜欢while (*ptr != '\0') ptr++;——或者使用strlen()

标签: c arrays string pointers reverse


【解决方案1】:

解决方案如下。正如我在下面的评论中所描述的,我添加了一个辅助指针,而不是在循环中使用 strings[j]。指针现在指向字符串的开头,而不是整个字符串数组。

void reverseString(char strings[NUM_STRINGS][STRING_LENGTH])
{
    int i, j;
    char *ptr;                              //Declare pointer variable.
    char *ptr2;
    for (i = 0; i < NUM_STRINGS; i++)
    {
        ptr = strings[i];
        ptr2 = strings[i];
        do {                                //Here, we ignore the null terminators in the char array.
            ptr++;
        } while (*ptr != '\0');
        ptr--;                              //Iterate the pointer variable once downward.
        j = i;

        while (ptr2 < ptr)          //While loop for reversing the string
        {
            char temp = *ptr2;
            *ptr2++ = *ptr;
            *ptr-- = temp;
        }
    }
}

【讨论】:

  • 请注意我的comment 关于do { ptr++; } while (…); 循环的主要问题。
猜你喜欢
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
相关资源
最近更新 更多