硬汉嵌入式论坛

 找回密码
 立即注册
查看: 481|回复: 9
收起左侧

[编程语言] strncat用法請教

[复制链接]

4

主题

6

回帖

18

积分

新手上路

积分
18
发表于 2023-12-18 17:07:53 | 显示全部楼层 |阅读模式
各位前輩好:

小弟從外部sensor接收資料後,整理成自己的格式並編碼成2bytes大小的char
最後需要合併到一個char變數透過UART傳送
目前遇到以下問題:strncat即便指定要合併多少byte大小字元,還是會遇到0x00就當作結束的問題
想請問這個問題是否無解,只能從memcpy去著墨?
20231218_CHAR.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2023-12-18 19:54:46 | 显示全部楼层
这个是libC的strncat源码,方便查找问题
https://github.com/lattera/glibc/blob/master/string/strncat.c

[C] 纯文本查看 复制代码
/* Copyright (C) 1991-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <[url]http://www.gnu.org/licenses/>.[/url]  */

#include <string.h>

#ifndef STRNCAT
# undef strncat
# define STRNCAT  strncat
# define STRNCAT_PRIMARY
#endif

char *
STRNCAT (char *s1, const char *s2, size_t n)
{
  char *s = s1;

  /* Find the end of S1.  */
  s1 += strlen (s1);

  size_t ss = __strnlen (s2, n);

  s1[ss] = '\0';
  memcpy (s1, s2, ss);

  return s;
}
#ifdef STRNCAT_PRIMARY
strong_alias (STRNCAT, __strncat)
libc_hidden_def (__strncat)
#endif

回复

使用道具 举报

10

主题

140

回帖

170

积分

初级会员

积分
170
发表于 2023-12-19 08:30:32 | 显示全部楼层
本帖最后由 lvehe 于 2023-12-19 08:34 编辑

原因很简单,char y[2]以 '\0'结尾,strlen(y) == 1,所以不会复制2个字节,实际只复制了一个字节。
回复

使用道具 举报

3

主题

48

回帖

57

积分

初级会员

积分
57
发表于 2023-12-19 10:16:03 | 显示全部楼层
台湾的兄弟?要是每个传感器只有2个byte数据量的话,直接用结构体填充就把它给合并了啊。
回复

使用道具 举报

22

主题

67

回帖

133

积分

初级会员

积分
133
发表于 2023-12-19 15:05:03 | 显示全部楼层
lvehe 发表于 2023-12-19 08:30
原因很简单,char y[2]以 '\0'结尾,strlen(y) == 1,所以不会复制2个字节,实际只复制了一个字节。

这里的0x00会被认为'\0'吗?
回复

使用道具 举报

4

主题

6

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2023-12-19 17:12:36 | 显示全部楼层
2360985396 发表于 2023-12-19 15:05
这里的0x00会被认为'\0'吗?

目前看起來是這樣沒錯,所以只會複製一個byte,所以我果斷使用記憶體大法
回复

使用道具 举报

4

主题

6

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2023-12-19 17:13:07 | 显示全部楼层
eric2013 发表于 2023-12-18 19:54
这个是libC的strncat源码,方便查找问题
https://github.com/lattera/glibc/blob/master/string/strncat.c ...

謝謝管理員,我參考下
回复

使用道具 举报

4

主题

6

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2023-12-19 17:13:59 | 显示全部楼层
lvehe 发表于 2023-12-19 08:30
原因很简单,char y[2]以 '\0'结尾,strlen(y) == 1,所以不会复制2个字节,实际只复制了一个字节。

是的,看起來Srncat即使告知他要連接多大的字串,他遇到0X00還是會停下來
回复

使用道具 举报

4

主题

6

回帖

18

积分

新手上路

积分
18
 楼主| 发表于 2023-12-19 17:15:09 | 显示全部楼层
bigbigcong 发表于 2023-12-19 10:16
台湾的兄弟?要是每个传感器只有2个byte数据量的话,直接用结构体填充就把它给合并了啊。

是台灣的弟兄沒錯,傳感器進來沒問題,因為經過我處理後編碼成我要的字串大小後,還要combine在一起,遇到這問題。
現在使出記憶體大法了,多虧我有用結構體
回复

使用道具 举报

22

主题

67

回帖

133

积分

初级会员

积分
133
发表于 2023-12-21 10:35:54 | 显示全部楼层
raycooldes 发表于 2023-12-19 17:15
是台灣的弟兄沒錯,傳感器進來沒問題,因為經過我處理後編碼成我要的字串大小後,還要combine在一起,遇 ...

还有就是strlen是不能求数组大小的,只能求字符串 假设你现在有char buff[10] = {0}; 你觉你能用strlen(buff)这样用吗 如果这个数组没有初始化 或者数组的内容是buff[0] = 0x00, buff[1]= 0x01 或者buf[0] = 0x00,buf[1] = 0x01每次strlen 都不一样
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 16:49 , Processed in 0.317241 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表