我正在做一个赋值,其中我必须实现一个功能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]);
}
答案 0 :(得分:2)
对不起,但是您的代码确实坏了。我真的不知道如何从根本上重写它,而不能“修复”它。首先最明显的是:
void reverse(char *str, int i, int j)
{
for (i = 0; i < len; i++)
您将变量i
初始化为零就扔掉了。因此,无论i
的值如何,此函数都将执行相同的操作。
您也没有充分的理由使用很多全局变量。除非您有充分的理由,否则请勿使用全局变量,这不是其中之一。将i,j,k,len,ind和temp的声明移到反转体内。将str的声明移到main内部。
从不使用变量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 :(得分:1)
此处应用的第一个编程原理是分解。您有两个任务:识别输入字符串中的单词,然后反转每个单词的字母。尝试同时做这两个事情比做任何一个都要困难得多。
首先编写一个将给定单词的开始和结束索引的单词反向的函数,然后编写第二个将识别单词的函数并调用第一个函数将它们反向。您可以先完成并测试第一个功能,然后再尝试第二个功能。