【问题标题】:Reverse string with external function使用外部函数反转字符串
【发布时间】:2015-12-08 16:35:58
【问题描述】:

我最近开始了一门 C 编程课程。我接到了一个任务,我将使用以下声明创建一个外部函数: void reverse(char *array, int numberOfChars)

我的代码目前看起来像这样。问题是代码只会反转单词的前半部分,而后半部分保持正常。

#include <stdio.h>
#include <string.h>

void reverse(char *array, int numberOfChars) {
    int i = 0;
    int j = 0;

    for (i = numberOfChars - 1; i >= 0; i--) {
        array[j] = array[i];
        j = j + 1;
    }
}

#define NAMESIZE 100

int main() {
    char word[NAMESIZE];
    int length;

    printf("Enter a word: ");
    scanf("%s", word);
    getchar();

    length = strlen(word);
    reverse(word, length);

    printf("%s\n", word);
}

【问题讨论】:

    标签: c function reverse


    【解决方案1】:

    即使您使用中间变量,您的代码也会将字符串反转两次,使其保持原样。对代码稍作改动,将ij 进行比较,并使用临时变量进行交换。

    int i, j = 0;
    char temp;
    for(i = numberOfChars-1; i > j; i--){
        temp = array[j];
        array[j] = array[i];
        array[i] = temp;
        j = j + 1;
    }
    

    【讨论】:

    • 这解决了问题!谢谢。
    【解决方案2】:

    您的函数有一个经典问题:您正在将字符串反转。您用结尾的字符覆盖字符串开头的字符。到达中点时,初始字符会丢失。相反,您应该交换两端的字符并停在中间点。

    【讨论】:

      【解决方案3】:

      您将需要一个辅助 char 数组来反转字符串。试试这样:

      #include <stdio.h>
      #include <string.h>
      
      #define NAMESIZE 100
      
      void reverse(char *arr,int numberOfChars);
      
      int main()
      {
          char word[NAMESIZE];
          printf("Enter a word: ");
          scanf("%s",word);
          getchar();
          size_t length=strlen(word);
          reverse(word,length);
          printf("%s\n",word);
      }
      
      void reverse(char *arr,int numberOfChars)
      {
          char buffer[NAMESIZE];
         int j = 0,i = numberOfChars;
          while( i-- )
              buffer[j++] = arr[i];
          buffer[j] = '\0';
          strcpy(arr,buffer);
      }
      

      【讨论】:

      • 您不需要第二个数组来执行此操作 - 您只需要一个字符的开销存储。
      【解决方案4】:

      防止覆盖数组的一种简单方法是将数组复制到一个临时数组中,并将反向读取的临时数组写入另一个。

      如果你想在编译时有一个未知的数组大小来反转,我建议你使用堆数组(参见man malloc)而不是堆栈一个,以防止segmentation fault 如果numberOfChars 太高。

      【讨论】:

      • 没有理由分配内存。函数签名接受 char*,因此它旨在就地进行交换。一个临时字符就可以了。
      猜你喜欢
      • 1970-01-01
      • 2020-10-03
      • 2013-02-25
      • 1970-01-01
      • 2020-06-07
      • 2012-08-06
      • 1970-01-01
      • 2011-03-26
      相关资源
      最近更新 更多