C语言strncpy函数如何复制数组中指定数据到指定位置?

C语言strncpy函数如何复制数组中指定数据到指定位置?
这是目的位置

u16 syear=2023;
u8  smon=08;
u8  sday=15;
u8  hour=10;
u8  min=56;
u8  sec=20;

这是原位置,inputstrs是网口输入的数据

char inputstr[len1];

且网口输入的数据经过打印显示正确

img


其中RENEWTIME是关键字,读取到RENEWTIME后后面的位置是时间,代码如下:

     if(strncmp(str8,inputstr,9)==0)                      //这句的意思即为判断是否读取到关键字
       {
            if(WORKMODE==NONE)
            {
                strncpy((uint16_t*)syear,&inputstr[9],4);
                printf("syear=%d\r\n",syear);
                strncpy((uint8_t*)smon,&inputstr[13],2);
                printf("smon=%d\r\n",smon);
                strncpy((uint8_t*)sday,&inputstr[15],2);
                printf("sday=%d\r\n",sday);
                strncpy((uint8_t*)hour,&inputstr[17],2);
                printf("hour=%d\r\n",hour);
                strncpy((uint8_t*)min,&inputstr[19],2);
                printf("min=%d\r\n",min);
                strncpy((uint8_t*)sec,&inputstr[21],2);
                printf("sec=%d\r\n",sec);
                RTC_Set(syear, smon, sday, hour, min, sec); /* Setup Time */
            }

        }

警告信息为
cast to pointer from integer of different size [-Wint-to-pointer-cast]
且无法正常写入,请问一下解决方法

strncpy是字符串拷贝,需要把字符串转换成数字类型

【以下回答由 GPT 生成】

问题的核心是在使用strncpy函数时出现了警告,并且无法正常执行数组的复制操作。警告信息指出了发生问题的地方,即将整数类型强制转换为指针类型。由于strncpy函数的第一个参数是目标字符串的指针类型,所以在这里需要对整数类型进行适当的转换。

解决这个问题的方法有两种选择:

解决方案一:将整数类型变量转换为字符串类型

可以通过将整数类型变量转换为字符串类型来解决这个问题。将整数类型变量转换为字符串后,就可以将其传递给strncpy函数。

以下是修改后的代码:

u16 syear = 2023;
u8 smon = 08;
u8 sday = 15;
u8 hour = 10;
u8 min = 56;
u8 sec = 20;

char inputstr[len1];

if(strncmp(str8, inputstr, 9) == 0) {
    if(WORKMODE == NONE) {
        char syear_str[5];
        sprintf(syear_str, "%04d", syear);
        strncpy(syear_str, &inputstr[9], 4);
        printf("syear=%s\r\n", syear_str);

        char smon_str[3];
        sprintf(smon_str, "%02d", smon);
        strncpy(smon_str, &inputstr[13], 2);
        printf("smon=%s\r\n", smon_str);

        char sday_str[3];
        sprintf(sday_str, "%02d", sday);
        strncpy(sday_str, &inputstr[15], 2);
        printf("sday=%s\r\n", sday_str);

        char hour_str[3];
        sprintf(hour_str, "%02d", hour);
        strncpy(hour_str, &inputstr[17], 2);
        printf("hour=%s\r\n", hour_str);

        char min_str[3];
        sprintf(min_str, "%02d", min);
        strncpy(min_str, &inputstr[19], 2);
        printf("min=%s\r\n", min_str);

        char sec_str[3];
        sprintf(sec_str, "%02d", sec);
        strncpy(sec_str, &inputstr[21], 2);
        printf("sec=%s\r\n", sec_str);

        RTC_Set(atoi(syear_str), atoi(smon_str), atoi(sday_str), atoi(hour_str), atoi(min_str), atoi(sec_str)); // 设置时间
    }
}

这里使用了sprintf函数将整数类型变量转换为字符串类型,然后再将字符串类型传递给strncpy函数。

解决方案二:使用强制类型转换

如果确定整数类型的大小与指针类型的大小相同,并且不会发生内存访问越界的情况,可以尝试使用强制类型转换来解决这个问题。

以下是修改后的代码:

u16 syear = 2023;
u8 smon = 08;
u8 sday = 15;
u8 hour = 10;
u8 min = 56;
u8 sec = 20;

char inputstr[len1];

if(strncmp(str8, inputstr, 9) == 0) {
    if(WORKMODE == NONE) {
        strncpy((char*)&syear, &inputstr[9], 4);
        printf("syear=%d\r\n", syear);

        strncpy((char*)&smon, &inputstr[13], 2);
        printf("smon=%d\r\n", smon);

        strncpy((char*)&sday, &inputstr[15], 2);
        printf("sday=%d\r\n", sday);

        strncpy((char*)&hour, &inputstr[17], 2);
        printf("hour=%d\r\n", hour);

        strncpy((char*)&min, &inputstr[19], 2);
        printf("min=%d\r\n", min);

        strncpy((char*)&sec, &inputstr[21], 2);
        printf("sec=%d\r\n", sec);

        RTC_Set(syear, smon, sday, hour, min, sec); // 设置时间
    }
}

这里使用了强制类型转换(char*)将整数类型转换为指针类型。

以上是两种解决问题的方法,您可以选择其中一种适合您的代码。希望能对您有所帮助!如果还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^