gdb查看代码的寄存器内容

gdb查看代码的寄存器内容

gdb查看代码的寄存器内容_第1张图片
简单的写了个demo

gdb查看代码的寄存器内容_第2张图片
demo 对应的汇编版本

gdb查看代码的寄存器内容_第3张图片
通过gdb设置断点,可以查看寄存器的内容, str的内容被放倒了寄存器rax, 通过rbp-0x10得到地址。

sscanf 函数

sscanf函数是C语言中的一个输入函数,用于从字符串中按照指定的格式提取数据。它的原型如下:

int sscanf(const char *str, const char *format, ...);

sscanf函数的第一个参数是要解析的字符串,第二个参数是格式化字符串,后面的参数是要存储解析结果的变量。

sscanf函数按照格式化字符串中的指示,从字符串中提取数据,并将其存储到相应的变量中。格式化字符串中的指示符可以是以下之一:

  • %d:解析一个十进制整数。
  • %f:解析一个浮点数。
  • %c:解析一个字符。
  • %s:解析一个字符串。
  • %u:解析一个无符号整数。
  • %x:解析一个十六进制整数。

除了以上指示符外,格式化字符串还可以包含空格、制表符和换行符等空白字符,用于跳过输入字符串中的空白字符。

sscanf函数返回成功解析的参数个数,如果解析失败则返回-1。如果解析过程中遇到无效的输入或格式不匹配,sscanf函数会停止解析,并将已解析的参数个数返回。

以下是一个示例,演示如何使用sscanf函数从字符串中提取数据:

#include 

int main() {
    char str[] = "John 25";
    char name[10];
    int age;

    sscanf(str, "%s %d", name, &age);

    printf("Name: %s\n", name);
    printf("Age: %d\n", age);

    return 0;
}

在这个例子中,我们从字符串"John 25"中提取名字和年龄。首先,我们定义了一个字符数组str,其中包含要解析的字符串。然后,我们定义了一个字符数组name用于存储提取的名字,和一个整数变量age用于存储提取的年龄。

接下来,我们调用sscanf函数并传入两个参数:要解析的字符串str和格式化字符串"%s %d"。格式化字符串中的%s表示提取一个字符串,%d表示提取一个整数。通过在格式化字符串中使用空格分隔,我们告诉sscanf函数在空格处将字符串分割成两个部分。

sscanf函数会根据格式化字符串的指示,从字符串str中提取名字和年龄,并将它们存储到nameage变量中。

最后,我们打印提取的结果,分别输出提取的名字和年龄。

请注意,sscanf函数可以根据格式化字符串的指示从字符串中提取多个值,并将它们存储到相应的变量中。在使用sscanf函数时,确保格式化字符串与要解析的字符串的格式相匹配,以便正确提取所需的值。

你可能感兴趣的:(c++)