sscanf()可以同时把十六进制或十进制数据解析成`int`类型。

简介

在写一个读取mipi_phy寄存器的脚本中,为解决读取参数支持十六进制或十进制的问题,发现了C库中的解包函数sscanf()

过程

由于main()获取到的参数是字符串类型,将字符串转换成int,最开始想到的方式是aoti()函数,但它无法解析十六进制,后查找文档后发现了sscanf(),它可以同时把十六进制或十进制数据解析成int类型。

描述

int sscanf(const char *str, const char *format, ...) 从字符串读取格式化输入。

参数

str — 这是 C 字符串,是函数检索数据的源。
format — 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。
format 说明符形式为 [=%[*][width][modifiers]type=]
详见:https://www.runoob.com/cprogramming/c-function-sscanf.html

实例

#include"stdio.h"
#include"stdlib.h"
#include"string.h"

int main(int argc,char *argv[])
{
  if(argc < 3)
  {
    printf("read  phy reg:  [ mipi_rw -r addr ] \n");
    printf("write phy reg:  [ mipi_rw -r addr val ] \n");
    return 0;
  }

  if(strncmp(argv[1], "-r",16) == 0)
  {
    unsigned short val=0;
    int addr=0;
    sscanf(argv[2],"%x",&addr);
    printf("read phy reg=[%#x], val=[%#x] \n",addr,val);
    return 0;
  }
  return 0;
}

编译:

gcc mipi_rw.c -o mipi_rw

运行结果:

$ mipi_rw -r 0x5
read phy reg=[0x5], val=[0]
$ mipi_rw -r 5
read phy reg=[0x5], val=[0]

Makefile代码:

include ../../GlobalRules.make
INSTALL_DIR = $(APIDEV_DIR)/bin
SRCS += $(wildcard ./*.c)
OBJS += $(SRCS:.c=.o)
CFLAGS   += -I$(shell pwd)
LFLAGS   += -L$(shell pwd)
LFLAGS   += -lmipi

%.o:%.c
	$(CC) $(CFLAGS)  -o $@ -c $^

default:
	make all

.PHONY:all
all: $(OBJS)
	$(CC) $^ $(CFLAGS) $(LFLAGS) -o $(shell pwd)/mipi_rw

版权声明:本文为lattelover原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lattelover/p/15214545.html