我很头疼,想解决我的任务。这是问题:
倒序
编写函数以反转单词顺序
给定一个字符数组中的单词句子,编写一个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/