1

我已经声明了一个数组char Buffer[100]="01 05 01 4A 63 41";,现在数组看起来像这样

Buffer[0]='0'
Buffer[1]='1'
Buffer[2]=' '
Buffer[3]='0'
Buffer[4]='5'

我只想将这些值转换为 int `例如:

  • Buffer[0]='0',Buffer[1]='1'到 0x01 (1)
  • Buffer[0]='0',Buffer[1]='5'到 0x05 (5)
  • ... ETC。

atoi()不能使用,因为它将所有Buffer值转换为整数。

如何将特定的空格分隔值子字符串转换为整数?

4

5 回答 5

1

我的第一个解决方案仅适用于整数,以下一个也适用于十六进制数。我写下了转换十六进制字符串表示的函数。数成十进制数。然后,按照 Jochim Pileborg 的建议,我使用 strtok 来解​​析给定的 Buffer 数组。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int hexToInt(char *tok)
{
  int i,out=0, tens=1, digit;
  for(i=strlen(tok)-1; i>=0; i--)
  {
    switch(tok[i])
    {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9': digit=tok[i]-'0';
                break;
      case 'A': digit=10; break;
      case 'B': digit=11; break;
      case 'C': digit=12; break;
      case 'D': digit=13; break;
      case 'E': digit=14; break;
      case 'F': digit=15; break;
    }
    out+=digit*tens;
    tens*=16;
  }
//  printf("hex:%s  int:%d ", tok, out);
  return out;
}

int main()
{
  char Buffer[100]="01 2A 10 15 20 25";
  int intarr[100],current=0;
  char *tok=malloc(20*sizeof(char));
  tok=strtok(Buffer," ");
  while(tok!=NULL)
  {
    intarr[current]=hexToInt(tok);
    current++;
    tok=strtok(NULL," ");
  }
  printf("\n");
}
于 2013-10-20T15:59:29.023 回答
1

您可以将Buffer其视为字符串(它是),并使用例如strtok“标记”空间边界上的数字。然后使用strtol将每个“令牌”转换为数字。

但请注意,它strtok 会修改字符串,因此如果您不希望这样做,则必须制作原件的副本Buffer并处理该副本。

另请注意,由于数字似乎是十六进制,因此您不能使用atoi该函数,因为该函数仅解析十进制数字。您必须使用strtol可以处理从 2 到 36 的任何碱基。

于 2013-10-20T13:32:38.333 回答
0

考虑一下:

#include <stdio.h>

int main()
{
    char Buffer[100] = "01 05 01 4A 63 41" ;
    const char* h = &Buffer[0] ;
    int i ;

    while( *h != 0 )
    {
        if( sscanf( h, "%2x", &i  ) == 1 )
        {
            printf( "0x%02X (%d)\n", i, i ) ;
        }

        h += 3 ;
    }

   return 0;
}

其输出为:

0x01 (1)
0x05 (5)
0x01 (1)
0x4A (74)
0x63 (99)
0x41 (65)

我假设所有的值都是十六进制的,都是两位数,并且都由一个空格(或者更确切地说是一个非 hex-difgit 字符)分隔,并且数组是 nul 终止的。如果其中任何一个条件不成立,则代码将需要修改。例如,如果值可能是可变长度,则格式说明符需要更改,并且您应该递增h直到找到空格或 nul,如果找到空格,则再次递增。

strtol()您可以使用而不是sscanf()for 转换编写类似的代码,但atoi()特定于十进制字符串,因此无法使用。

如果您对指针算法感到不舒服,那么通过数组索引等效的是:

#include <stdio.h>

int main()
{
    char Buffer[100] = "01 05 01 4A 63 41" ;
    int c = 0 ;
    int i ;

    while( *h != 0 )
    {
        if( sscanf( &Buffer[c], "%2x", &i  ) == 1 )
        {
            printf( "0x%02X (%d)\n", i, i ) ;
        }

        c += 3 ;
    }

   return 0;
}

以及strtol()您喜欢的版本:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char Buffer[100] = "01 05 01 4A 63 41" ;
    const char* h = &Buffer[0] ;

    while( *h != 0 )
    {
        int i = strtol( h, 0, 16 ) ; 
        printf( "0x%02X (%d)\n", i, i ) ;

        h += 3 ;
    }

   return 0;
}
于 2013-10-20T15:11:42.720 回答
0

您可以将 Buffer[i] 转换为 int。然后检查它的值,它将是 ASCII。48->0 。. 57->9

您甚至可以将 char 与其 ASCII 值进行比较,而无需强制转换

int CharToDigit(char c)
{
    if(c>=48 && c<=57) // or as suggested if(c>='0' && c <='9')
        return (int)c - 48; // subtract the ascii of 0
    return -1; // not digit
}

对于从 A 到 F 的数字,您必须从大写字母中减去 55(65-10,65 是 A 的 ascii)

然后遍历 Buffer 中的字符将它们发送到函数: CharToDigit(Buffer[i])并检查返回的 int。

于 2013-10-20T16:13:03.170 回答
0

您可以为此使用 sscanf,例如:

int intarr[6];
sscanf(Buffer,"%d %d %d %d %d %d",&intarr[0],&intarr[1],&intarr[2],&intarr[3],&intarr[4],&intarr[5]);
于 2013-10-20T13:32:04.110 回答