数组逆序排列和数组逆序打印,虽然它们最后输出的结果是相同的,但是其过程确有着很大的区别。
1.区别
(1)逆序打印:就是在不改变原数组的基础上,将数组从后往前打印出来,注意数组中的值没有变化
(2)逆序排列:此时数组的内容发生了变化,比如一个字符数组"abcdefg”,逆序排列后就变成了"gfedcba"。
2.举例实现
这里我们就用字符数组abcdefg
(1)逆序打印
int main()
{
int i = 0;
char arr[] = "abcdefg";
int sz = strlen(arr);
for (i = sz - 1; i >= 0; i--)
{
printf("%c ", arr[i]);
}
return 0;
}
结果显示为
从代码中我们可以很清楚的看到,数组中的值并没有改变。
(2)逆序排列
这里我们定义一个函数reverse_strlen(),将逆序排列的代码放在其里面
void reverse_string(char arr[])
{
int left = 0;
int right = strlen(arr) - 1;
while (left < right)
{
char tmp = 0;
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
代码实现为:
int main()
{
int i = 0;
char arr[] = "abcdefg";
int sz = strlen(arr);
reverse_string(arr);
for (i = 0; i <= sz - 1; i++)
{
printf("%c ", arr[i]);
}
return 0;
}
从代码中,我们可以看出,虽然两种过程结果显示一样,但是使用for循环打印时顺序是不一样的,这就说明了在逆序排列中原数组的值确实发生了改变,由此,我们就很好的说明了它们的区别。
3.其他
在代码中,我们在求字符数组大小时不光可以使用strlen(),也可以用
int sz = sizeof(arr)/sizeof(arr[0]);
但是它们会有一点不同,就是以这种方式求出的大小会比使用strlen()的结果大1,原因在于我们对字符数组初始化时
char arr[] = "abcdefg";
虽然我们看到有7个字符,但其实在字符g后面还隐藏着一个\0,它也被初试化到了数组中。
而使用strlen()求字符串大小时,其结果是到字符串中第一个\0时字符的个数。例如
int main()
{
char arr[] = "abcdefg";
char arr1[] = "abc\0defg";
int sz = strlen(arr);
int sz1 = strlen(arr1);
printf("%d\n", sz);
printf("%d", sz1);
return 0;
}
结果为:
因此我们在使用
int sz = sizeof(arr)/sizeof(arr[0]);
求出sz后,在for循环中,我们的i就要小于等于sz-2;
for(i = 0;i<=sz-2;i++)
以上就是我们需要注意的点。
当然了,如果不想使用库函数的时候,我们可以自己定义一个求字符数组大小的函数my_strlen()
int my_strlen(char arr[])
{
int count = 0;
int i = 0;
while(arr[i] != '\0')
{
count++;
i++;
}
return count;
}
这里函数的参数是char arr[],代表的是第一个数组元素的地址,其本质是一个指针变量,因此也可以写成char* arr;
以上就是简单说明的内容,如果有说的不对的地方欢迎指正。