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)
  • ...など

atoi()Bufferすべての値を整数に変換するため、使用できません。

特定のスペースで区切られた値の部分文字列を整数に変換する方法は?

4

5 に答える 5

1

文字列として扱うことができBuffer(それはそうです)、たとえばstrtokスペース境界の数字を「トークン化」するために使用できます。次にstrtol、各「トークン」を数値に変換するために使用します。

ただし、文字列をstrtok 変更することに注意してください。そのため、元のコピーを作成して、そのコピーで作業する必要がある場合は、その必要はありませんBuffer

atoiまた、数値は16進数のように見えるため、その関数は10進数のみを解析するため、使用できないことに注意してください。strtol2 から 36 までの任意の基数を処理できるものを使用する必要があります。

于 2013-10-20T13:32:38.333 に答える
1

私の最初の解決策は整数に対してのみ機能し、次の解決策は 16 進数に対しても機能します。16進数の文字列表現を変換する関数を書き留めました。数を 10 進数にします。次に、Jochim Pilborg の提案に従って、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 に答える
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 に答える