printf函数打印带回车符号的字符串

本文探讨了一段C语言代码在使用printf函数打印含有特殊字符的字符串时遇到的问题。当字符串末尾包含'/r'这样的控制字符时,打印行为会受到影响,导致光标回退并覆盖后续的内容。通过具体示例,本文解释了这一现象的原因及其背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     printf("command length is : %d, AT command:%s. /n", strlen(at_command), at_command);

     以上语句打印的结果是前两个字符始终是". ",因为%s对应的at_command字符串的最后一个字符是/r,打印到该字符(控制字符)时光标回车到行首,打印后面的". /n"。

### 单片机接收字符串并提取数据的方法 在单片机开发过程中,当接收到一个包含有用数据的字符串时,通常需要从中提取有效部分。以下是具体方法及其示例: #### 1. 使用字符查找定位目标数据 可以通过特定分隔符(如逗号 `,` 或空格 ` `)来分割字符串,并提取所需的部分。例如,在 STM32 的 HAL 库中,可以利用标准 C 函数 `strtok()` 来完成这一操作。 ```c #include <string.h> void ExtractData(char *inputString) { char *token; token = strtok(inputString, ","); // 假设以逗号作为分隔符 while (token != NULL) { // 对每个子字符串进行处理 printf("Extracted Token: %s\n", token); token = strtok(NULL, ","); } } ``` 这种方法适用于简单的协议结构,其中各字段由固定分隔符区分[^1]。 #### 2. 数字与字符串之间的转换 如果接收到的是表示数值的字符串,则需将其转换为对应的整型或其他类型的数据。C 语言提供了多种工具用于这种转换,例如 `atoi()` 和自定义解析逻辑。 对于更复杂的场景,可能涉及浮点数或带单位的量值。下面展示了一个例子,演示如何将形如 `"123.45"` 的字符串安全地转变为实际的小数形式。 ```c float StringToFloat(const char* str) { float result = 0.0f; int sign = 1; // 符号标志位,默认正数 int decimalPlace = 0; if (*str == '-') { sign = -1; ++str; } while (*str && isdigit(*str)) { result = result * 10 + (*str - '0'); ++str; } if (*str == '.') { ++str; while (*str && isdigit(*str)) { result += pow(10, --decimalPlace) * ((*str++) - '0'); } } return result * sign; } // 调用实例 char input[] = "123.45"; printf("%.2f\n", StringToFloat(input)); // 输出应为 123.45 ``` 上述代码片段展示了手动实现的一个简单版本[^2]。 #### 3. DMA 技术下的高效数据获取 采用直接存储器访问(DMA)技术能够显著提升串口通信效率。一旦配置完毕,所有传入的信息都会自动填充至预分配好的缓冲区内等待进一步分析。 假设我们已经设置好了基于 HAL 库的串口中断服务程序以及相应的回调机制,那么接下来只需要关注于如何从这些原始资料里挑选出感兴趣的内容即可[^3]。 #### 4. 数据校验确保准确性 为了防止误判错误消息或者受到噪声影响而做出不当决策,在正式运用之前往往还需要加入额外层次的安全措施——即执行某种形式的数据完整性检验算法。一种常见做法就是计算帧头到结束标记之间所有字节总和再取反作为附加域随同主体一同传输;接收端则重复相同运算并与预期结果对比确认无误后再继续后续流程。 ```c unsigned char CheckSum(unsigned char *pData, unsigned short length){ unsigned char sum=0; for(int i=0;i<length;i++){ sum+=*(pData+i); } return ~sum+1; } bool VerifyChecksum(unsigned char *rec_buf){ return rec_buf[4]==CheckSum(rec_buf,7)?true:false;//假定第四个位置保存着校验码 } ``` 以上伪代码说明了基本原理[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值