C 将命令行输入字符串解析为字符数组

C 将命令行输入字符串解析为字符数组,c,command-line-arguments,C,Command Line Arguments,我正在尝试编写一个C程序,其中来自命令行参数的输入格式为0x1234aabb 这肯定是以char*[]的形式出现在程序中的 现在,我想以chara[]={0x12,0x34,0xaa,0xbb}的形式存储这个输入 请帮助。我首先要做的是使用基本参数为16(十六进制)的strtoul将字符串解析为整数unsigned long的大小保证至少为32位,因此,如果所有数字都有8位十六进制数字(4字节),那么它应该是合适的类型 有了数字后,按位移位和按位和数字4次提取组成数字的4个字节中的每一个。下面是

我正在尝试编写一个C程序,其中来自命令行参数的输入格式为
0x1234aabb

这肯定是以char
*[]
的形式出现在程序中的

现在,我想以
chara[]={0x12,0x34,0xaa,0xbb}
的形式存储这个输入


请帮助。

我首先要做的是使用基本参数为16(十六进制)的
strtoul
将字符串解析为整数
unsigned long
的大小保证至少为32位,因此,如果所有数字都有8位十六进制数字(4字节),那么它应该是合适的类型

有了数字后,按位移位和按位和数字4次提取组成数字的4个字节中的每一个。下面是一个例子:

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

#define NUM_BYTES 4

int main(void)
{
   char *input = "0x1234aabb";
   unsigned long num = strtoul(input, NULL /* TODO: error checking */, 16);
   unsigned char bytes[NUM_BYTES];
   unsigned i;

   printf("The number is: 0x%lx\n", num);

   /* bytes[0] = LSB, bytes[NUM_BYTES - 1] = MSB */
   for (i = 0; i < NUM_BYTES; i++) {
      bytes[i] = (num >> 8*i) & 0xFF; /* byte = 8 bits, 0xFF = max byte value */
      printf("Byte %u: 0x%x\n", i+1, bytes[i]);
   }

   return 0;
}

如果您知道字符串的长度总是固定的(例如,在您的示例中为10个字符),那么您可以将字符串分成四个相等的部分,每三个字符长(两个用于数字,一个用于终止符),然后在每个部分上使用
strtoul
。如果参数少于10个字符,请只填写相关部分,并将另一部分保留为
“00”

尝试以下方法来解析任意长度的输入:

#include <stdio.h>

int main(int argc, char** argv)
{
    char *input;
    int len;
    int num;
    char *a;
    int i;
    int tmp;

    if (argv < 2)
    {
        printf("No input specified!\n");
        return 0;
    }

    input = argv[1]; // "0x1234aabb"
    if (strncmpi(input, "0x", 2) != 0)
    {
        printf("Bad input!\n");
        return 0;
    }

    printf("Input: %s\n", input);

    input += 2;
    len = strlen(input);
    num = (len / 2) + (len % 2);
    if (num < 1)
    {
        printf("Bad input!\n");
        return 0;
    }

    printf("Number of bytes: %d\n", num);

    a = (char*) calloc(num, sizeof(char));
    if (a == NULL)
    {
        printf("Cannot allocate memory for bytes!\n");
        return 0;
    }

    for (i = 0; i < num; ++i)
    {
        if (sscanf(input, "%2x", &tmp) != 1)
        {
            printf("Byte %d: Illegal byte value '%02s'\n", i+1, input);
            break;
        }

        a[i] = (char) tmp;
        printf("Byte %d: 0x%02x\n", i+1, a[i]);

        input += 2;
    }

    free(a);

    return 0;
}
#包括
int main(int argc,字符**argv)
{
字符*输入;
内伦;
int-num;
char*a;
int i;
int tmp;
如果(argv<2)
{
printf(“未指定输入!\n”);
返回0;
}
输入=argv[1];/“0x1234aabb”
如果(strncmpi(输入,“0x”,2)!=0)
{
printf(“输入错误!\n”);
返回0;
}
printf(“输入:%s\n”,输入);
输入+=2;
len=strlen(输入);
num=(len/2)+(len%2);
if(num<1)
{
printf(“输入错误!\n”);
返回0;
}
printf(“字节数:%d\n”,num);
a=(char*)calloc(num,sizeof(char));
如果(a==NULL)
{
printf(“无法为字节分配内存!\n”);
返回0;
}
对于(i=0;i
您可以使用
strtoll
将字符串解析为数字。thnaks..可以工作,但我想我需要做更多的工作,因为输入字符串是16字节(32个字符),您的输出是反向的。OP希望字节按
0x12 0x34 0xaa 0zbb
顺序存储,但您将它们改为按
0xbb 0xaa 0x34 0x12
顺序存储。@RemyLebeau:是的,我知道,如果他需要相反的顺序(
bytes[NUM_bytes-1-I]
),他可以对代码进行简单的修改。
strtoul()
strtoull()最多工作4个字节,而
strtoull()
最多8个字节。除此之外的任何内容(他最多需要16个字节)都需要手动解析。
#include <stdio.h>

int main(int argc, char** argv)
{
    char *input;
    int len;
    int num;
    char *a;
    int i;
    int tmp;

    if (argv < 2)
    {
        printf("No input specified!\n");
        return 0;
    }

    input = argv[1]; // "0x1234aabb"
    if (strncmpi(input, "0x", 2) != 0)
    {
        printf("Bad input!\n");
        return 0;
    }

    printf("Input: %s\n", input);

    input += 2;
    len = strlen(input);
    num = (len / 2) + (len % 2);
    if (num < 1)
    {
        printf("Bad input!\n");
        return 0;
    }

    printf("Number of bytes: %d\n", num);

    a = (char*) calloc(num, sizeof(char));
    if (a == NULL)
    {
        printf("Cannot allocate memory for bytes!\n");
        return 0;
    }

    for (i = 0; i < num; ++i)
    {
        if (sscanf(input, "%2x", &tmp) != 1)
        {
            printf("Byte %d: Illegal byte value '%02s'\n", i+1, input);
            break;
        }

        a[i] = (char) tmp;
        printf("Byte %d: 0x%02x\n", i+1, a[i]);

        input += 2;
    }

    free(a);

    return 0;
}