用外部函数反转字符串

Reverse string with external function

我最近开始了一门 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);
}

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

即使您使用中间变量,您的代码也会将字符串反转两次,使其保持原样。对代码的一个小改动将 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;
}

您将需要一个辅助 char 数组来反转 string.Try,如下所示:

#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] = '[=10=]';
    strcpy(arr,buffer);
}

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

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