如何在C语言中将整数赋值给字符串数组元素?
C语言字符串数组修改问题:从错误到正确实现
先拆解你代码里的错误点:
为什么你的尝试都失败了?
1. *time_array[3] = &day2convert;的问题
time_array是指针数组,每个元素是指向字符串的char*。time_array[3]指向的是字符串字面量"Mon"的第一个字符'M',*time_array[3]就是这个'M'字符本身。- 你把
&day2convert(一个uint32_t变量的地址)赋值给它,本质是把地址的低8位(强制转成char)覆盖了'M',剩下的"on"还在,所以才会出现"don""4on"这种拼接出来的奇怪结果。 - 更关键的是:字符串字面量存在只读内存区,直接修改它的内容属于未定义行为,本来就不能这么干。
2. strcpy(time_array[3], &day2convert);的问题
strcpy要求源是以'\0'结尾的char序列,但&day2convert是整数变量的地址,里面存的是1的二进制(比如小端模式下是0x01 0x00 0x00 0x00),根本不是字符串。就算强行复制,目标还是只读的字面量,写入同样是未定义行为,结果肯定不对。
正确实现需求的两种方法
你的核心需求是把整数转成两位字符串(补前导0),替换数组里的对应元素,这里给你两种可行方案:
方案1:用可写的二维字符数组
直接把数组定义成二维char数组,每个元素都是可写的缓冲区,不用纠结指针的问题:
#include <stdio.h> #include <stdint.h> int main() { // 每个元素分配4字节空间,足够存最多3位字符串+结束符 char time_array[7][4] = {"45", "55", "11", "Mon", "29", "Aug", "2022"}; uint32_t day2convert = 1; uint32_t month2convert = 8; // 用sprintf格式化整数为两位字符串,%02u表示补前导0 sprintf(time_array[3], "%02u", day2convert); sprintf(time_array[5], "%02u", month2convert); for (int j = 0; j < 7; ++j) { printf("after conversion : %s\n", time_array[j]); } return 0; }
方案2:保留指针数组,分配可写内存
如果必须用char*数组,需要把要修改的元素换成可写的内存(比如用malloc分配):
#include <stdio.h> #include <stdint.h> #include <string.h> #include <stdlib.h> int main() { char *time_array[7]; // 不需要修改的元素可以直接用字面量 time_array[0] = "45"; time_array[1] = "55"; time_array[2] = "11"; // 要修改的元素分配可写内存,复制初始值 time_array[3] = malloc(4); strcpy(time_array[3], "Mon"); time_array[4] = "29"; time_array[5] = malloc(4); strcpy(time_array[5], "Aug"); time_array[6] = "2022"; uint32_t day2convert = 1; uint32_t month2convert = 8; sprintf(time_array[3], "%02u", day2convert); sprintf(time_array[5], "%02u", month2convert); for (int j = 0; j < 7; ++j) { printf("after conversion : %s\n", time_array[j]); } // 记得释放分配的内存,避免泄漏 free(time_array[3]); free(time_array[5]); return 0; }
关于字符串数组的必知要点
char* time_array[7]是指针数组,每个元素是char*,指向字符串首地址。它可以隐式转成char**,但char**不一定是指针数组(比如可能指向单个char*的指针)。- 字符串字面量(如"Mon")是只读的
const char数组,C允许赋值给char*但绝对不能修改内容,修改属于未定义行为。 *array[ii] = &var这种写法完全错误:*array[ii]是单个char,&var是指针,类型不匹配;如果要替换整个字符串指针,应该写array[ii] = 新的char*地址,但这个地址必须指向合法的、以'\0'结尾的字符序列。
内容的提问来源于stack exchange,提问作者Gipsy
相关产品推荐
相关产品推荐

