我很头疼,想解决我的任务。这是问题:

倒序

编写函数以反转单词顺序

给定一个字符数组中的单词句子,编写一个C函数以反转单词顺序。

char * reverse_word_order(char * str);

该函数将一个字符数组作为其唯一参数,将其中的单词顺序反转,然后将结果放回其中。为了方便起见,它返回终止参数的指针。

请参见以下示例。

char str[] = `" this    is very beautiful    "`;
printf ("[%s]\n", reverse_word_order(str)); /* print `[beautiful    very is this   ]` */


注意空格字符的位置没有移动;上面示例的结果是[beautiful very is this ],而不是[ beautiful very is this]

适用以下约束:


  没有外部函数调用。 (strlen,strcpy等)。没有明确的记忆
  在堆上分配(malloc,realloc,动态数组等)
  需要这些功能,自己编写。


我写了这段代码:

#include <stdio.h>
int length (char* str){
int L=0;
while(*str++){
    L++;
 }
return L;
}
int Last(char* zi) {
int i;
for(i=length (zi); i>0;i--){
    if (zi[i]!='\0'){
        return i;
    }
}
}
void reverse_substring(char* zi, int start, int end){
char Temporary;
int i,z;
for(i=start, z=end; i<z; i++,z--){
    Temporary = zi[i];
    zi[i]=zi[z];
    zi[z]=Temporary;
}
}
char* reverse(char* zi){
char *str = zi;
int len = length (zi);
int i=0;
int count=0;

reverse_substring(str,0,Last(str));
while(i<=len){
    if(str[i] ==' ' || i==len){
        reverse_substring(str,i-count,i-1);
        count=0;
    }
    if(str[i]!=' '){
        count++;
    }
    i++;
}
return str;
}

int main(int argc, char **argv){
char str[] = " this    is very beautiful   ";
printf("Length of string: %d\n",length(str));
printf("[%s]\n", reverse(str));

}


但是上面代码的输出是:[ beautiful very is this],它不能确认问题的要求。

输出应为:[beautiful very is this ]

有任何想法吗?

谢谢。

最佳答案

好的:我添加了两个函数,一个函数将所有不必要的空间剥离并计算其数量,另一个函数将它们合并在一起。我将在这里复制主要和功能。

void strip_spaces(char *str, int *spaces)
{
    int len = length(str);
    int i, j, l, flag;
    for (i = 0; i < 100; i++)
        spaces[i] = 0;
    i = 0; j = 0; l = 0;
    while(str[i] != '\0'){
        flag = 0;
            while(str[i] == ' '){
                i++;
                flag = 1;
                spaces[l]++;
            }
            if (flag == 1){
                l++;
                str[j++] = ' ';
            }
            else{
                str[j++] = str[i++];
            }
        }
        str[j] = '\0';
}
void add_spaces(char *str, int *spaces)
{
    int i = 0;
    int flag;
    int l = 0;
    char stra[1000];
    while(str[i] != '\0'){
        stra[i] = str[i];
        i++;
    }
    stra[i] =  str[i] = '\0';
    printf("%s*\n%s*\n", stra, str);

    i = 0;
    int j = 0;
    while(stra[i] != '\0'){
        flag = 0;
        if(stra[i] == ' ')
           while(spaces[j]  > 0 ){
               flag = 1;
               spaces[j]--;
               str[l] = ' ';
               l++;
           }
        if (flag == 1){
            j++;
            i++;

        }
        else{
            str[l++] = stra[i++];
        }

    }
    str[l] = '\0';
}

int main(int argc, char **argv)
{
    char str[] = " this    is very beautiful   ";
    int spaces[100];
    strip_spaces(str, spaces);
    reverse(str);
    add_spaces(str, spaces);
    printf("Length of string: %d\n",length(str));
    printf("%s\n", str);
    return 0;
}

关于c - 反向句子,同时保持C语言中空间的位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25326322/

10-11 15:31