新手注册,赏金不多,见谅!刚刚因为工作需要要熟悉STM32,以前编过几年的51……
开发环境为Keil MDK 5, 使用了原子的部分库函数。
最近碰到要组合字符串的需求,输出一个版本信息。
用main函数初步测试,发现无论使用 strlen() 还是 sizeof() 均不能返回字符串(数组)的长度(容量大小)。
请问各位有没有谁碰到过这种情况?
Use MicroLIB 状态下:
测试代码如下:
1.首先包含了必要的标准库文件:
[mw_shl_code=c,true]
/*************ANSI C 标准库头文件************/
//禁止半主机模式
#pragma import(__use_no_semihosting)
#include <stdio.h> //struct __FILE, printf, sprintf... Need Target->Use MicroLIB
//#include "mystdio.h"//struct __FILE, printf, sprintf... Need Target->Use MicroLIB
#include <string.h> //standard string operation: strcpy, strcat...
.......
[/mw_shl_code]
2.main()下加入如下代码:
[mw_shl_code=c,true]
int main(void)
{
char * s[2], str[30], sTmp[20];
const char *pcc = "abcdef";
uint16_t i = 103, f;
size_t len = 0;
s[0] = "JLP280";
s[1] = "-A/A-";
sprintf(sTmp, "%s", s[0]);
strcat(sTmp, s[1]); //sTmp = s[0] + s[1]
f = i;
i /= 100;
f %= 100;
len = 1000; //如果注释此句, 编译会出warning: len 定义了但没使用. 说明下面改变len值得3句没有作用...
//str = sTmp + "1.03"
sprintf(str, "%s%s%d.%02d,len=%.5u", s[0], s[1], i, f, len);
len = sizeof(str); //设断点, len的值没有被改变!!
len = strlen(str);
len = strlen(pcc);
//......
}
[/mw_shl_code]
然后编译,可以通过,无warning。
问题1:软件仿真,设断点在len改变之处,发现 len 的数值无变化。
问题2:同时查看到 strlen() 的 type 怎么是 “void f()” ?? 而 strcat() [string.h] , sprintf() [stdio.h] 功能均正常.
以下是软件仿真截图,个人认为跟软件仿真没关系,这都是C标准库操作,跟硬件基本无关也不会影响硬件什么……求解!
软件仿真 strlen 01
软件仿真 strlen 02
各位帮忙看看哪里不对吗?谢先,必须有请原子兄~~
好吧,顺便发个小共享置一下顶:
MDK 5的 'Use MicroLIB' 环境下(MDK 4也应该一样),sprintf衔接2个字符串,
【如:sprintf(dest_str, "%s%s", char * from_s1, char * from_s2),相当于 strcat 的效果:from_s1字符串结尾的空字符' '会被自动覆盖! 】用我此贴的例子可以验证. 因此如果strlen()仍然无法使用,需要自己写的话, 可以去掉 [string.h] 库的包含,直接使用 sprintf 即可实现字串组合目的.
难道ST的微库对此还是做了改动的?? 这个很细节啊。 按 谭浩强 那本书上的说(p75 printf), 标准ANSI C 的 sprintf() 做2字符串衔接,不会去除 s1 的' ' . 这个原来好像还验证过,现在没环境了(DOS622+x86工控+Turbo C),是否像书上所说,不得而知。
一周热门 更多>