当我决定尝试时,这似乎是一个简单的想法,但知道它让我疯了。 我可以反转整个字符串,但现在我试图反转字符串的各个部分。 示例:
"pizza is amazing" to "azzip si amazing"
基本上我的程序应该从 a点到b 反转一个字符串,分别对其中的任何单词进行处理。我的逻辑看似正确(至少对我而言),但显然有些错误,因为我的输出只是第一个单词"pizza"
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *reverse(char *a, int i, int j){ //reverse the words
char temp;
while(i<j){
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
return a;
}
char *words(char *a, int i, int j){ // identify if there are any words from a-b
int count = i;
while(i<j){
if(a[i] == ' '){ // a space signifies the end of a word
reverse(a , i-count, i);
count = 0; //reset count for next word
}
i++;
count++;
}
return a;
}
int main(){
char a[50];
char *a2;
printf("Enter a string:\n); //string input
scanf("%s", a);
int strlength = strlen(a) + 1;
a2 = (char *)malloc(strlength*sizeof(char));
strcpy( a2, a);
printf("Reversed string:\n%s", words(a, 0, 4)); // create a-b range
return 0;
}
我意识到我的问题很可能在words()
之内。我没有想法。
答案 0 :(得分:0)
问题1:
您应该更加谨慎地命名变量,可理解且有意义的名称可以帮助程序员和其他人阅读代码。请记住,这非常重要。
问题2:
当您将参数%s
传递给scanf()
时,它将读取后续字符,直到找到空格(空格字符被视为空白,换行符和制表符)。
您可以使用scanf("%[^\n]", a)
读取所有字符,直到找到换行符。
有关scanf()
的进一步参考,请查看here。
问题3:
看一下words()
函数,你没有存储基本索引(从哪里开始反转)。对reverse()
的调用告诉它要反转单个字符(没有任何变化)。
你没有指定整个单词是否必须在范围内才能被反转,或者即使它在边缘(例如:一半,一半)。我假设整个单词必须在范围内,请查看words()
函数的此修改版本:
char *words(char *str, int fromIndex, int toIndex){
int i = fromIndex;
int wordStartingIndex = fromIndex;
/*
It is necessary to expand the final index by one in order
get words bounded by the specified range. (ex: pizza (0, 4)).
*/
toIndex += 1;
/* Loop through the string. */
while(i <= toIndex){
if(str[i] == ' ' || str[i] == '\0' || str[i] == '\n'){
reverse(str, wordStartingIndex, i-1);
wordStartingIndex = (i + 1);
}
i++;
}
return str;
}
这应该让你开始。功能并不完美,您需要对其进行修改以处理一些特殊情况,例如我提到的情况。