反向数组,为什么在除以2时才有效?

时间:2017-01-08 16:53:05

标签: c arrays for-loop reverse

我有下面的代码向后写一个单词,我理解除了for循环中的一个小细节之外的一切:for(int i = 0; i< numberOfChars / 2; i ++)。 “/ 2”做了什么,为什么只能用它?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <time.h> // time


void reverse(char array[], int numberOfChars) {

    for (int i = 0; i < numberOfChars /2; i++) {
        char tmp;

        tmp = array[i];
        array[i] = array[numberOfChars - i - 1];
        array[numberOfChars - i - 1] = tmp;

    }
}


int main(void) {

    char word[55];
    int howMany;

    printf("Please enter a word:\n");
    scanf_s("%s", word, sizeof(word));
    printf("how many char do you want to reverse?\n");
    scanf_s("%d", &howMany);

    reverse(word, howMany);

    printf("New arr:%s\n", word);


    return 0;
}

3 个答案:

答案 0 :(得分:0)

因为使用此代码,您将开头放在最后,并将结尾放在字符串的开头。所以,当你运行一半的&#34; howMany&#34;你的用户希望改变它,它已经改变了它。

答案 1 :(得分:0)

正如Ryan在评论中指出的那样,如果你不包括/2,那么数组中的每个位置都会被交换两次,然后再回到它开始的位置。例如,如果您有5个元素,则执行以下操作:

  swap 0 with 4
  swap 1 with 3
  swap 2 with 2
  swap 3 with 1
  swap 4 with 0

顺便说一下,如果你使用两个索引迭代数组而不是一个,我觉得这个代码会变得更清晰:

int i=0;
int j=numberOfChars-1;
while(i < j){
    char tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
    i++;
    j--;
}

答案 2 :(得分:0)

该分区将数组减半。跟踪算法时,它会从左侧切换一个,另一个从右侧切换。对于均匀尺寸,每个数字都要交换。对于奇数尺寸,同样的平均,除了中间的一个停留在同一个地方。当我遇到算法时,我用纸和笔解决了它。因为更有效地获得其逻辑的方式。 Here是描述的解释。 结果,如果它没有减半,首先反转到阵列的一半,然后再次反转,所以保持相同的顺序。