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

时间:2014-12-19 12:25:55

标签: c string hex 64-bit scanf

以下是我的示例代码:

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,这应该是加号,是不是做了一些根本错误的事情?

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

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();
   } 
} `

3 个答案:

答案 0 :(得分:1)

如果代码以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""%i"

的整数格式说明符
unsigned long long b,c;
if (sscanf(buf, "%lli %c%lli", &b, &a, &c) != 3) {
  Handle_Bad_Input();
}

为什么char str [20]; scanf("%s", str);遇到麻烦:

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

"%s"说明符缺少宽度,例如"%19s",因此可以轻松填充str

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

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

答案 1 :(得分:0)

您正在使用scanf读取字符串并将其存储为整数。我认为这就是造成这个问题的原因。

此外,来自MAN页面

AME
       scanf,  fscanf, sscanf, vscanf, vsscanf, vfscanf 

       ...

RETURN VALUE

   These functions return the number of input items  successfully  matched
   and assigned, which can be fewer than provided for, or even zero in the
   event of an early matching failure.

   The value EOF is returned if the end of input is reached before  either
   the  first  successful conversion or a matching failure occurs.  EOF is
   also returned if a read error occurs, in which case the error indicator
   for  the  stream  (see ferror(3)) is set, and errno is set indicate the
   error.

答案 2 :(得分:0)

我认为你错过了这项任务,如果你想知道有多少参数匹配,那么就改变这个

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

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

到这个

scanf("%s", str);

argsread = sscanf(str, "%x%c%x", b, &a, c);

根据你的评论,你应该改变一些其他的东西,可能这个代码会起作用

char a;
char str [64];
unsigned int b;
unsigned int c;
char B[11];
char C[11];
int argsread;

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

    scanf("%s", str);

    argsread = sscanf(str, "0x%x%c0x%x", &b, &a, &c);
    if (argsread == 3) 
    {
        printf("\n %d arguments read\n", argsread);

        snprintf(B, sizeof(B), "0x%08X", b);
        snprintf(C, sizeof(B), "0x%08X", c);

        printf("\n %s%c%s\n", B, a, C);
    }
}
return 0;