c - 打印整数数组时输出不正确
问题描述
我想创建一个通用的打印数组函数。此函数将根据数据类型打印数组元素。
#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) 但我得到了编译器错误。
解决方案
您正在对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
推荐阅读
- javascript - 拖拽上传
- swift - Swift 包构建错误:无法构建 Objective-C 模块“Darwin”
- case-insensitive - Blue Prism 决策阶段忽略字母大写
- reactjs - 在 xState 操作中设置上下文并触发方法
- ios - 如何在 Swift 4 中初始化代码生成的按钮边框
- debugging - OpenCL + Intel System Studio 2019 - GPU 调试问题
- android - 在 android 中按下时更改选项卡布局的选项卡中的文本大小
- c# - 打开其他 EXCEL 文件时不加载 VSTO Excel 模板
- python - 在 tensorflow 中,如何将索引列表转换为指标向量?
- python - 如果循环为空,则显示一条消息