首页 > 解决方案 > 打印整数数组时输出不正确

问题描述

我想创建一个通用的打印数组函数。此函数将根据数据类型打印数组元素。

#include "utilities.h"

//type : 0 ->int
//     : 1->char
void print_array(void *arr, int length, int type){
    int i = 0;

    for(i=0;i<length;i++){
        switch(type) {
            case 0:
                printf("Integer %d  %d\n", (int*)(arr+i));
                break;
            case 1:
               printf("%c \n", (char*)(arr+i));
               break;
            case 2:
                printf("%s \n", (char*)(arr+i));
                break;
            case 3:
                printf("%x \n", (int*)(arr+i));
                break;
            default:
                printf("Format not supported yet. %d \n",type);
                return;

        }
    }
}


void test_print_array(){
    int int_arr[3] = {0,1,2};
    print_array(int_arr,3,0);

}

int main(){
    test_print_array();
    return 0;
}

我得到的输出是

整数 -486474964

整数 -486474963

整数 -486474962

而不是 0,1,2

我也尝试使用 arr[i] 而不是 (int*)(arr+i) 但我得到了编译器错误。

标签: c

解决方案


您正在对void*大小未知的类型使用指针算术。您必须在进行算术运算之前转换指针,但无论如何使用数组表示法更清楚。

#include <stdio.h>

void print_array(void *arr, int length, int type){
    int i = 0;

    for(i=0;i<length;i++){
        switch(type) {
            case 0:
                printf("int %d\n", ((int*)arr)[i]);
                break;
            case 1:
                printf("char %c\n", ((char*)arr)[i]);
                break;
            case 2:
                printf("string %s \n", ((char**)arr)[i]);
                break;
            case 3:
                printf("hex %X\n", ((unsigned*)arr)[i]);
                break;
            default:
                printf("Format not supported yet. %d \n",type);
                return;

        }
    }
}

void test_int_array(){
    int int_arr[3] = {0, 1, 2};
    print_array(int_arr, 3, 0);

}

void test_char_array(){
    char char_arr[3] = {'x', 'y', 'z'};
    print_array(char_arr, 3, 1);

}

void test_str_array(){
    char *str_arr[3] = {"one", "two", "three"};
    print_array(str_arr, 3, 2);

}

void test_uns_array(){
    unsigned uns_arr[3] = {26, 27, 28};
    print_array(uns_arr, 3, 3);

}

int main(){
    test_int_array();
    test_char_array();
    test_str_array();
    test_uns_array();
    return 0;
}

程序输出:

整数 0
诠释 1
诠释 2
字符 x
字符
字符 z
字符串一
字符串二
字符串三
十六进制 1A
十六进制 1B
十六进制 1C


推荐阅读