带外部函数的反向字符串

时间:2015-12-08 16:35:59

标签: c function reverse

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

你需要一个辅助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);
}

答案 3 :(得分:1)

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

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