逐字反转字符串

时间:2018-11-26 14:32:04

标签: c

我正在尝试编写一个程序来反转用户输入的字符串。

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];

但是我不太明白为什么。你能帮我吗?

3 个答案:

答案 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()也可能失败。为此进行测试。