wqererty

  • 2024-09-17
  • 加入了学习《ARM Cortex-M0 全可编程SoC原理及实现》,观看 Cortex-M0课程导学

  • 加入了学习《自己动手做一台计算机》,观看 32位和64位寻址空间

  • 发表了主题帖: 字符串处理

    本帖最后由 wqererty 于 2024-9-17 22:42 编辑 将字符串清空 1、使用memset函数: char str[] = "Hello, world!"; // 清空字符串 memset(str, 0, sizeof(str)); 2、使用strcpy函数将一个空字符串复制到目标字符串中。这也是一种有效的方法来清空字符串。 char str[] = "Hello, world!"; strcpy(str, ""); 3、或者使用循环将整个字符串的元素设为'\0' 将数字转化为字符或字符串 1、将一个整数数字(0-9)转换为对应的字符可以通过加上'0',这个方法适用于单个数字(0-9)。 int num = 7; char ch = num + '0'; // 将数字转换为字符 在这个例子中,将数字7转换为字符'7'。 2、使用sprintf函数将长度较大的数字转化为字符串 int num = 123; char str[20]; // 使用 sprintf 将整数转换为字符串 sprintf(str, "%d", num); 字符串转化为数字 在 C 语言中,将字符串转换为数字通常可以使用标准库函数atoi,atol,atoll,strtol,strtoll和strtof,strtod,strtold来实现。这些函数提供了将字符串解析为整数或浮点数的功能。 1. 使用atoi, atol, atoll atoi: 将字符串转换为 int。 atol: 将字符串转换为 long。 atoll: 将字符串转换为 long long。 这些函数不提供错误处理,因此如果字符串格式不正确,结果可能不确定。 例子: #include <stdio.h> #include <stdlib.h> // For atoi, atol, atoll int main() { const char *str = "12345"; int num1 = atoi(str); long num2 = atol(str); long long num3 = atoll(str); printf("atoi: %d\n", num1); printf("atol: %ld\n", num2); printf("atoll: %lld\n", num3); return 0; } 2. 使用 strtol, strtoll strtol: 将字符串转换为 long。 strtoll: 将字符串转换为 long long。 这些函数提供了错误处理机制,通过检查转换过程中 endptr 指针的位置来确定是否成功转换,并可以指定进制。 例子: #include <stdio.h> #include <stdlib.h> // For strtol, strtoll int main() { const char *str = "12345"; char *endptr; long num1; long long num2; num1 = strtol(str, &endptr, 10); // 10 是十进制 num2 = strtoll(str, &endptr, 10); if (*endptr != '\0') { printf("部分转换失败\n"); } printf("strtol: %ld\n", num1); printf("strtoll: %lld\n", num2); return 0; } 3. 使用 strtof, strtod, strtold strtof: 将字符串转换为 float。 strtod: 将字符串转换为 double。 strtold: 将字符串转换为 long double。 这些函数也提供了错误处理机制,并可以处理浮点数的转换。 例子: #include <stdio.h> #include <stdlib.h> // For strtof, strtod, strtold int main() { const char *str = "123.456"; char *endptr; float fnum; double dnum; long double ldnum; fnum = strtof(str, &endptr); dnum = strtod(str, &endptr); ldnum = strtold(str, &endptr); if (*endptr != '\0') { printf("部分转换失败\n"); } printf("strtof: %f\n", fnum); printf("strtod: %lf\n", dnum); printf("strtold: %Lf\n", ldnum); return 0; }  

  • 2024-03-29
  • 发表了主题帖: 关于STM32F103输入捕获配置过程的问题

    1、输入捕获边沿的选择 在进行输入捕获的配置时,会用到这个结构体:TIM_ICInitTypeDef,具体如下, typedef struct { uint16_t TIM_Channel; uint16_t TIM_ICPolarity; uint16_t TIM_ICSelection; uint16_t TIM_ICPrescaler; uint16_t TIM_ICFilter; } TIM_ICInitTypeDef; 这个结构体的第二个参数TIM_ICPolarity似乎有三个可选的配置: #define TIM_ICPolarity_Rising ((uint16_t)0x0000) //上升沿 #define TIM_ICPolarity_Falling ((uint16_t)0x0002) //下降沿 #define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) //双边沿 但是!!!在这三个宏定义下还有两个带参宏! #define TIM_ICPolarity_Rising ((uint16_t)0x0000) #define TIM_ICPolarity_Falling ((uint16_t)0x0002) #define TIM_ICPolarity_BothEdge ((uint16_t)0x000A) #define IS_TIM_IC_POLARITY(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \ ((POLARITY) == TIM_ICPolarity_Falling)) #define IS_TIM_IC_POLARITY_LITE(POLARITY) (((POLARITY) == TIM_ICPolarity_Rising) || \ ((POLARITY) == TIM_ICPolarity_Falling)|| \ ((POLARITY) == TIM_ICPolarity_BothEdge)) 可以看出 IS_TIM_IC_POLARITY(POLARITY) 是不支持双边沿的 而IS_TIM_IC_POLARITY_LITE(POLARITY) 支持双边沿 而ST官方的库函数TIM_ICInit()实现过程中有下面一段代码: if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4) ||(TIMx == TIM5)) { assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); } else { assert_param(IS_TIM_IC_POLARITY_LITE(TIM_ICInitStruct->TIM_ICPolarity)); } 也就是说如果是定时器1~5,8就执行IS_TIM_IC_POLARITY(POLARITY) 否则就执行 IS_TIM_IC_POLARITY_LITE(POLARITY),我们都知道,STM32F103系列只有定时器1~8,而定时器6,7不支持输入捕获,因此在进行输入捕获的配置时不能将TIM_ICPolarity设置为TIM_ICPolarity_BothEdge。此外,为解决这个问题进行查找资料的过程中,在ST全球论坛上发现了如下回答: 原文链接:[bug report] no definition TIM_ICPOLARITY_BOTHE... - STMicroelectronics Community 大概意思就是TIM1/8不支持TIM_ICPolarity_BothEdge 而TIM9/10/11/12/13支持TIM_ICPolarity_BothEdge 但是在我配置过程中将TIM_ICPolarity设置为TIM_ICPolarity_BothEdge,即 /*定时器4输入捕获配置*/ TIM4_InPutCapture.TIM_Channel = TIM_Channel_3; TIM4_InPutCapture.TIM_ICFilter = 4; TIM4_InPutCapture.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM4_InPutCapture.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM4_InPutCapture.TIM_ICPolarity = TIM_ICPolarity_BothEdge; //上升沿下降沿都进行捕获 TIM_ICInit(TIM4,&TIM4_InPutCapture); 在编译过程中也并未出现警告和报错,在执行TIM_ICInit()到下面的代码时 if((TIMx == TIM1) || (TIMx == TIM8) || (TIMx == TIM2) || (TIMx == TIM3) || (TIMx == TIM4) ||(TIMx == TIM5)) { assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); } else { assert_param(IS_TIM_IC_POLARITY_LITE(TIM_ICInitStruct->TIM_ICPolarity)); } 按道理说应该只会执行  assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity)); 而 IS_TIM_IC_POLARITY(POLARITY)又不支持 TIM_ICPolarity_BothEdge,编译过程不应该出现报错或者警告吗?希望有人可以解答一下我的问题。

最近访客

现在还没有访客

< 1/0 >

统计信息

已有--人来访过

  • 芯积分:20
  • 好友:--
  • 主题:2
  • 回复:0

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言