使用数组时出现意外结果

时间:2017-08-29 19:01:06

标签: c

先生,我是一名新的程序员。所以我面临一些我真正需要解决的新问题。就像我写代码一样

#include<stdio.h>
 main(){
  int ara[] ={10,20,30,40,50,60,70,80,90,100},i,temp,j; 
  for(i=0,j=9;i<10;i++,j--){ 
      ara[i]=ara[j];
      printf("%d\n",ara[i]); } 
    }

我认为结果将是100,90,80,70,60,50,40,30,20,10但结果不是这样的......有人请告诉我为什么结果显示100,90 ,80,70,60,60,70,80,90,100

3 个答案:

答案 0 :(得分:3)

打印值60后,即当您尝试进一步访问元素时,数组的一半,实际上您将访问那些位于数组中间之后的位置的元素。因为你是用ara [i] = ara [j]来分配它们所以你最终会在一半的数组之后重复。 为: -

ara[0] = ara[9]
ara[1] = ara[8]
ara[2] = ara[7]
ara[3] = ara[6]
ara[4] = ara[5]
ara[5] = ara[4]

最简单的解决方案可能是创建一个临时数组: -

#include<stdio.h>
 main(){
  int ara[] ={10,20,30,40,50,60,70,80,90,100},i,temp[10],j; 
  for(i = 9, j = 0; i >= 0; i--, j++){ 
      temp[j]=ara[i];
   } 
  for(i = 0; i < 10; i++){
      printf("%d\n", temp[i]);
  }

}

答案 1 :(得分:1)

您在此代码中正在做什么?

  

反转数组

为什么要打印100,90,80,70,60,50,60,70,......

  

因为当你到达第6个(ara [4])时,你已经把它换成了第4个(ara [6])

答案 2 :(得分:1)

您需要在临时变量中保存首先写入的值

一些例子

char *reverse(char *str)
{
    char tmp;
    int len;

    if (str != NULL)
    {
        len = strlen(str);
        for (int i = 0; i < len / 2; i++)
        {
            tmp = *(str + i);
            *(str + i) = *(str + len - i - 1);
            *(str + len - i - 1) = tmp;

        }
    }
    return str;
}

int *reverseints(int *data, size_t size)
{
    int tmp;

    if (data != NULL)
    {
        for (int i = 0; i < size / 2; i++)
        {
            tmp = *(data + i);
            *(data + i) = *(data + size - i - 1);
            *(data + size - i - 1) = tmp;

        }
    }
    return data;
}