我的代码是不是正确地从每个单独的单词中反转字符串?

问题描述 投票:-2回答:2

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

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

userinput:

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]);
}
c string loops char reverse
2个回答
2
投票

对不起,但你的代码真的坏了。我真的不知道如何“修复”它,而不是从头开始重写它。第一个最明显的是:

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

你通过将变量i初始化为零来丢弃它。所以这个函数会做同样的事情,无论i的价值如何。

你也没有充分的理由使用很多全局变量。除非你有充分的理由,否则千万不要使用全局变量,而这不是其中之一。将i,j,k,len,ind和temp的声明移到反转体内。在主要内部移动str的声明。

从不使用变量j。

切勿使用gets功能。它已从现代C中删除。

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

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

$ 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)
                                ~~~~^

1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.