我有下面的代码向后写一个单词,我理解除了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;
}
答案 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是描述的解释。 结果,如果它没有减半,首先反转到阵列的一半,然后再次反转,所以保持相同的顺序。