我正在尝试编写一个程序来反转用户输入的字符串。
Enter a sentence: you can cage a swallow can't you
Reversal of sentence: you can't swallow a cage can you
因此,我想到了逐字符扫描字符串。然后将字符串从头到尾复制到新字符串中。在这一点上,我知道每次看到一个空格都会有一个新词,因此我必须反转两个空格之间字母的顺序。这是我的代码:
#include <stdio.h>
#include <string.h>
int main(){
char sentence[64], reversal[64], reversal_copy[64];
int i = 0, index = 0;
printf("Enter a sentence: ");
while(sentence[strlen(sentence)-1]!= '\n'){
scanf("%c", &sentence[i]);
i++;
}
printf("Reversal of sencente: ");
for(int h = strlen(sentence) - 2, k = 0; h >= 0; h++, k++){
reversal[k] = sentence[h];
strcpy(reversal_copy, reversal);
if(sentence[h] == ' '){
for(int m = h; m >= index && m <= h; m--, index++){
reversal[m] = reversal_copy[index];
}
}
}
printf("Reversal of sentence: %s\n\n", reversal);
return 0;
}
我收到一个细分错误,我相信它会在这里发生:
for(int h = strlen(sentence) - 2, k = 0; h >= 0; h++, k++){
reversal[k] = sentence[h];
但是我不太明白为什么。你能帮我吗?
答案 0 :(得分:2)
您的第一个循环继续的条件是h >= 0
,并且随着您每次递增h
,它将不断增大,直到超过sentence
的大小并抛出错误。
如果该循环的意图是向后遍历sentence
,那么我认为您应该减小h和k(h--, k--
),但是如果您的意图是往前遍历sentence
那么您需要更改条件,以便一旦h
到达sentence
的结尾,循环就结束了
答案 1 :(得分:1)
可以使用递归函数反转单词顺序。
#include <stdio.h>
#include <string.h>
void reverse ( char *str, char *original) {
char temp[strlen ( str) + 1];
temp[0] = 0;
int offset = 0;
if ( 1 == sscanf ( str, "%s%n", temp, &offset)) {
reverse ( str + offset, original);//recursive call
}
else {//at the end of the original string
*original = 0;//set zero at first character
return;
}
//as recursion unwinds, concatenate the words
strcat ( original, temp);
if ( str != original) {//will be false when unwinds reaches first iteration
strcat ( original, " ");
}
return;
}
int main( void) {
char text[] = "you can cage a swallow can't you";
printf ( "%s\n", text);
reverse ( text, text);
printf ( "%s\n", text);
return 0;
}
答案 2 :(得分:0)
对于初学者:
在while
循环的第一次迭代期间,strlen()
在未初始化的变量上被调用。这会调用未定义的行为。任何事情都会发生。
在逐个字符更新char
数组的任何情况下,您都完全忽略了以下事实:要使0
数组成为C字符串,必须使用char
终止符。只能将C字符串传递给str*()
函数中的大多数。
scanf()
也可能失败。为此进行测试。