2015-12-08 66 views
-1

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

回答

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; 
} 
+0

这解决了问题!谢谢。 – user3249677

1

您的函数有一个经典问题:您正在反转字符串。用字符从末尾覆盖字符串开头的字符。到达中点时,初始角色会丢失。你应该换掉两端的角色,并在中点停下来。

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] = '\0'; 
    strcpy(arr,buffer); 
} 
+0

你不需要第二个数组来做到这一点 - 你只需要一个字符的开销存储。 –

1

一个简单的方法,以防止覆盖您的阵列到阵列的复制到一个临时之一,将反转的临时数组写入另一个。

如果你想拥有在编译一个未知的数组大小扭转,我建议你使用一个堆阵列(见man malloc),而不是堆一个防止segmentation fault如果numberOfChars太HIGHT。

+0

没有理由分配内存。函数签名接受一个char *,所以它的目的是在原地进行交换。一个临时字符很好。 –