【问题标题】:My code is not reversing string of characters from each separate word correctly?我的代码没有正确地从每个单独的单词中反转字符串?
【发布时间】:2019-08-20 06:26:17
【问题描述】:

我正在做一个任务,我必须实现一个函数 reverse(),它可以反转索引 i 和 j 之间的字符串。 reverse(str, 0, 4) 将索引0和4之间的字符串从apple反转到elppa。通过查找每个单词的开始和结束位置并反转单词,可以反转所有单词。

void reverse(char *str, int i, int j). for example

用户输入:

apple orange banana

将输出:

elppa egnaro ananab

但我的代码什么也没打印。我知道有很多错误,但我被卡住了,不知道如何从这里开始。 我的代码是:

#include <stdio.h>
#include <string.h>
void reverse(char *str, int i, int j);
int i, j, k, len, ind, temp;
char str[100];
int main()
{

    printf("Enter a string: \n");
    gets(str);
    len = strlen(str);
    reverse(str, i, j);
    return 0;
}
void reverse(char *str, int i, int j)
{
    for (i = 0; i < len; i++)//
    {
        ind = i;
            //index of the end of each word
        if (str[i] == ' ' || str[i] == '\n')//ends at index of whites space
        {
            ind = i - 1;//index of empty space -1
            i= 0;//i is reset to 0
            if (i <= ind)//0<last index of word
            {
                //reverse
                temp = str[i];
                str[i] = str[ind];
                str[ind] = temp;
            }
        }
      }
   printf("%s\n",str[i]);
}

【问题讨论】:

  • 你有一个无限循环,因为 i 被重置为 0。
  • 您的描述中有相互矛盾的信息:您是要反转 i 和 j 之间的字符串,还是要单独反转 i 和 j 之间找到的所有单词? ——我假设是后者。在这种情况下,我强烈建议您将问题分解为多个部分,并单独解决它们:一个用于反转字符串的函数,一个用于在字符串中查找单词的函数,以及一个用于将反转函数迭代地应用于所有单词的函数,因此找到了。

标签: c string loops char reverse


【解决方案1】:

抱歉,您的代码确实损坏了。如果不从头开始重写它,我真的不知道如何“修复”它。第一个最明显的是:

void reverse(char *str, int i, int j)
{
    for (i = 0; i < len; i++)

通过将变量i 初始化为零,您将丢弃变量i 中的任何内容。所以无论i的值如何,这个函数都会做同样的事情。

您还无缘无故地使用了很多全局变量。除非你有充分的理由,否则永远不要使用全局变量,这不是其中之一。将 i、j、k、len、ind 和 temp 的声明移到 reverse 的主体内。在 main 中移动 str 的声明。

变量 j 从未使用过。

永远不要使用函数gets。它已从现代 C 中删除。

printf("%s\n",str[i]); 毫无意义。您正在尝试打印第 i:th 个字符,但作为字符串。这是未定义的行为。

打开编译器警告。这是我编译你的代码时得到的:

$ gcc b.c -Wall -Wextra
b.c: In function ‘main’:
b.c:10:5: warning: implicit declaration of function ‘gets’; did you mean ‘fgets’? [-Wimplicit-function-declaration]
     gets(str);
     ^~~~
     fgets
b.c: In function ‘reverse’:
b.c:34:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
    printf("%s\n",str[i]);
            ~^    ~~~~~~
            %d
b.c:15:36: warning: unused parameter ‘j’ [-Wunused-parameter]
 void reverse(char *str, int i, int j)
                                ~~~~^

【讨论】:

    【解决方案2】:

    这里应用的第一个编程原则是分解。你有两个任务:识别输入字符串中的单词,并反转每个单词的字母。尝试同时做这两件事比做任何一个都困难得多。

    首先编写一个函数来反转一个单词,给定它的开始和结束索引,然后编写第二个函数来识别单词并调用第一个函数来反转它们。您可以在尝试第二个功能之前完成并测试第一个功能。

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 2015-06-02
      • 1970-01-01
      相关资源
      最近更新 更多