将字符串扫描为十六进制字符数组

2024-01-30

这是我的示例代码:

char a;
char str [20];
unsigned char b[8] ;
unsigned char c[8];

int argsread;
int i;

init_8051();

while(1)
{
    printf("\n enter a 64 bit operation \n");

    argsread = scanf("%s", str);

    sscanf(str, "0x%x%c0x%x", b, &a, c);

    printf("\n %d arguments read \n",argsread);

        for(i=0;i<8;i++)
{
             printf("\n %#x %c %#x\n",b[i],a,c[i]);
}
        }

}

这里的问题是,当我在终端中输入以下输入时: 0x1234567890abcdef+0x1234567890abcdef

这会导致错误,其中 char 数组的输出完全错误,并且大多数数字都追踪到 a ,这应该是加号, ai 是否在做一些根本错误的事情?

Update:我将代码更改为以下内容:

while(1)
{
printf("\n enter a 64 bit operation \n");
argsread = scanf("%s", str);
sscanf(str, "0x%s%c0x%s", b, &a, c);
printf("\n %d arguments read \n",argsread);

printf("\n %s \n",b);
}

我将 str 的大小增加到 30 问题是程序的输出是:

 1 arguments read 

 abcdef+0xabcdef 

所以 b 的值不仅仅是 abcdef 它是整个字符串!

Update2:发现这段代码运行完美,但我想使用 scanf 而不是 cin 这是代码

:`#include <iostream> 

using namespace std;

int main()
{

  float a, b, result;
    char oper, clear;
    cout << "Please enter an equation: i.e 5+5 " << endl;
    for (;;) {
          cin >> a;
          cin >> oper;
          cin >> b;
         if (oper == '+')
        result = a + b;
         else if (oper == '-')
            result = a - b;
       else if (oper == '*')
              result = a * b;
     else if (oper == '/')
              result = a / b;   
    cout << "= " << result << endl << endl;
    cin.clear();
    cin.ignore();
   } 
} `

如果代码以以下开头,用户输入和错误处理会更容易fgets().
然后使用sscanf(), strtol()等来解析。

printf("\n enter a 64 bit operation \n");
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) Handle_IOErrororEOF();

char a;
char b[17];  // use right size arrays
char c[17];
// use width of 16 and %[]
if (sscanf(buf, " 0x%16[0-9abcdef] %c 0x%16[0-9abcdef]", b, &a, c) != 3) {
  Handle_Bad_Input();
}

OTOH,只需使用允许十六进制输入的整数格式说明符"%x" or "%i"

unsigned long long b,c;
if (sscanf(buf, "%lli %c%lli", &b, &a, &c) != 3) {
  Handle_Bad_Input();
}

Why char str [20]; scanf("%s", str);有麻烦:

"%s"做了三件事:
1) 扫描但不保存所有前面的(0 个或更多)空白 (' ', '\t', '\n ', etc.).
2) 扫描并保存所有非空白区域。
3)最后到达一个空白。它停止扫描并将空白放回stdin.

The "%s"说明符缺少宽度,例如"%19s",所以很容易溢出str

sscanf(str, "0x%s%c0x%s", b, &a, c);也有麻烦。

输入的第一个数字的末尾和后面的数字之间没有空格'+', so "%s"继续扫描。代码不检查返回值sscanf()然后使用a, b, c. So a, b, c可能无法正确扫描或初始化 - 导致潜在的未定义行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字符串扫描为十六进制字符数组 的相关文章

随机推荐

  • 显示高级自定义字段的 JSON API - WordPress

    I am developing a magazine WordPress site that will have a json feed for a Mobile App I set the backend up using Advance
  • 我应该在 Swift Playgrounds 的 .gitignore 文件中包含什么?

    我想使用 Git 对我的 Playground 进行版本控制 但我不确定哪些文件应该被忽略以及哪些文件应该提交 目前我使用以下 gitignore游乐场文件 Xcode user data xcuserdata 还应该有什么 来自官方Swi
  • 使用环境调用 popen

    在我的 Lua 程序中 我必须捕获外部程序的输出 该外部程序需要某些环境变量 所以我这样做 e e e A 100 e e B Hi e e C Test file io popen e bin aprogr 显然 如果环境很大 popen
  • 如何使用Python获取两个PDF文件的差异?

    我需要找出两个 PDF 文件之间的差异 有谁知道任何与Python相关的工具具有直接给出两个PDF的差异的功能吗 你所说的 差异 是什么意思 PDF 文本存在差异或某些布局发生变化 例如 调整了嵌入图形的大小 第一个很容易检测 第二个几乎不
  • SQLITE 数据库在 java 中被锁定(IDE NetBeans)

    当我执行任何操作时 它在数据库中工作 但突然显示数据库已锁定错误 假设这是在一个按钮上执行的操作 private void jButton6ActionPerformed java awt event ActionEvent evt Sah
  • 是否可以在 webpack 中创建自定义解析器?

    当需要模块时我有自己的约定 例如 require components SettingsPanel 应解决require components SettingsPanel SettingsPanel js 有什么方法可以创建这样的解析器吗
  • 在谷歌闭包库中创建自定义事件调度程序时出现问题

    我正在尝试在 google Closure js 库中创建自定义事件调度程序 我将此代码基于 fx 文件夹中的动画类 但我不断收到此错误 goog events 未定义 但我将事件包放在顶部 这是我的代码 goog provide test
  • 如何自动重新连接 Rails 6 PostgreSQL 连接?

    我有一个带有一些工作进程的 Rails 6 应用程序 该应用程序使用 PostgreSQL 作为数据库 有时数据库会重新启动 例如次要版本升级 并且工作人员会失去连接 我希望他们能够自动重新连接 但它没有发生 我尝试使用reconnect
  • GWT 中的字符串格式化程序

    如何在 GWT 中格式化字符串 我做了一个方法 Formatter format new Formatter int matches 0 Formatter formattedString format format d numbers s
  • opencv中的HoughCircles函数可以检测圆内的圆吗?

    我在 OpenCV 中遇到了用于圆检测的 HoughCircles 但它有一个参数指定检测到的圆之间的最小距离 我担心的是 如果两个圆同心 即一个圆在另一个圆内 这是否有效 谢谢 沙尚克 如果两个圆的中心相距足够远 霍夫变换将仅返回 2 个
  • 将当前应用程序作为单实例运行并显示前一个实例

    我刚刚实现了这段保护应用程序单个实例的代码 以免应用程序运行两次 现在我想知道如何显示已经运行的原始应用程序进程 这是我在程序类中的代码 static class Program STAThread static void Main con
  • 合并两个已排序的链表

    这是微软笔试时提出的编程问题之一 我给出了我提出的问题和答案 事情是我的答案 虽然看起来很全面 至少对我来说 但我觉得行数可以减少 这是用 C 语言问的 我是一个 Java 人 但我设法编写了它 我的答案可能包含太多类似 Java 的语法
  • 使用重复条目绘制置信区间和预测区间

    I have a correlation plot for two variables the predictor variable temperature on the x axis and the response variable d
  • 如何在 Rstudio 演示文稿中创建表格

    我正在尝试在 RStudio Rpres 文件中创建一个表 以下是我目前在网上搜索到的内容 但对齐不正确 这是最好的方法吗 关于对齐有什么建议吗 Test Right Left Default Center 12 12 12 12 123
  • 基本的多文件上传不适用于移动设备

    我创建了一个非常基本的多文件上传表单示例 参考 https bootsnipp com snippets kWqEj 它在桌面上运行完美 但在移动设备上运行不佳 至少在我测试的移动设备上是这样 On Mobile Xiaomi Mi4 An
  • 在 Eclipse 中配置 Logback

    我正在从 Log4j 切换到 Logback 但我还没有成功地使 Logback 工作 我已经放置了logback xml在我的 Eclipse Java 项目的根目录中 下面是其内容
  • 样式选择下拉框

    我有一个 HTML 选择下拉框 我已经对其进行了样式设置 我遇到的问题是我似乎无法设置选项的背景颜色样式 下面是演示的链接 您可以看到下拉选项有白色背景 我正在尝试更改它 http cssdeck com labs lnroxrua htt
  • 如何从 xml 获取垂直按钮视图

    我想在垂直方向创建一个按钮 也许我们可以通过扩展一个按钮并将画布重新渲染 旋转 到垂直方向 我们可以获得自定义按钮 但我需要从 xml 检查图形表示 我需要一个像这样的按钮 请参阅下面的链接 应该可以解决您的问题 http blog sty
  • 如何在ionic 3中使用jquery

    我正在尝试使用 ionic 3 中的 jquery 在 div 中加载外部网站 TS export class HomePage constructor public navCtrl NavController loadExternalUR
  • 将字符串扫描为十六进制字符数组

    这是我的示例代码 char a char str 20 unsigned char b 8 unsigned char c 8 int argsread int i init 8051 while 1 printf n enter a 64