使用XC8编译器使用MPLAB以C语言编写PIC 16代码.

我正在try 从字符串中捕获一些波特率设置,例如"115200,8,N,1". 出于我的应用程序的目的,我 Select 使用枚举来表示宇称(N、O、E变成0,1,2).

我有以下代码:

#include <stdint.h>

int main(void)
{
    uint32_t baudrate;
    uint8_t databits, parity, stopbits;

    char *input = "115200,8,0,1";

    sscanf(input, "%lu,%u,%u,%u", &baudrate, &databits, &parity, &stopbits); 
    printf("%lu - %u - %u - %u\n", baudrate, databits, parity, stopbits);

    return 0;
}

我预计会有以下输出:

>> 115200 - 8 - 0 - 1

然而,我得到了:

>> 115200 - 0 - 0 - 1

我做错了什么,因为第二个捕获总是返回0.我假设我使用了错误的标识符,但应该使用哪些标识符?

推荐答案

%u告诉sscanf匹配输入字符串中的可选带符号的小数,将其值转换为unsigned int,并将结果存储在相应参数指向的unsigned int中.

&databits并不意味着unsigned int.因此,C标准没有定义程序的行为.

同样,%u代表&parity%u代表&stopbits是错误的,%lu代表&baudrate可能是错误的,也可能不是错误的,具体取决于C实现的具体细节.

正确的转换说明符字符由<inttypes.h>标头中的宏定义,可以这样使用:

#include <inttypes.h>
#include <stdio.h>
#include <stdint.h>


int main(void)
{
    uint32_t baudrate;
    uint8_t databits, parity, stopbits;

    char *input = "115200,8,0,1";

    sscanf(input, "%" SCNu32 ",%" SCNu8 ",%" SCNu8 ",%" SCNu8,
        &baudrate, &databits, &parity, &stopbits); 
    printf("%" PRIu32 " - %" PRIu8 " - %" PRIu8 " - %" PRIu8 "\n",
        baudrate, databits, parity, stopbits);

    return 0;
}

SCNscanf个转换字符启动宏,然后u为无符号的integer类型,后面是位数.PRIprintf个转换启动类似的宏.这些宏将被带引号的字符串替换,并且上面代码中连续的带引号的字符串将合并为一个字符串.

例如,"%" SCNu32 ",%" SCNu8 ",%" SCNu8 ",%" SCNu8最终可能相当于%u,%hhu,%hhu,%hhu.

\n结束打印的行.对于有关缓冲区的C默认设置和Shell行为,这更适合.

使用return 0;或在main中返回EXIT_SUCCESS;(在<stdlib.h>中定义)以退出成功的程序执行.您还可以让控制流到main的结尾以退出成功的程序执行.使用return EXIT_FAILURE;表示失败.您可以在特定环境中使用return 1;,但您应该注意它不可移植.

C++相关问答推荐

当我try 计算一个多项时,看到segfault.我做错了什么?

由Go调用E.C.引起的内存快速增长

C:fopen是如何实现二进制模式和文本模式的?

这是一个合法的C Strdup函数吗?

在C23中使用_GENERIC实现带有右值的IS_POINTER(P)?

C中的指针增量和减量(*--*++p)

如何使用C for Linux和Windows的标准输入与gdb/mi进行通信?

在为hashmap创建加载器时,我的存储桶指向它自己

struct -未知大小

如何在GDB中查看MUSL的源代码

我在反转双向链表时遇到问题

循环中的静态变量与块中的变量和循环

使用Open62541向OPCUA服务器发送读请求时内存泄漏

如何将两个uint32_t值交织成一个uint64_t?

用于计算位数和的递归C函数

如何在MSVC中使用intSafe.h函数?

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

在列表中查找素数

GDB 用内容初始化数组

在带中断的循环缓冲区中使用 易失性