将字符指针转换为无符号字符数组

7

我想将char指针转换为unsigned char变量,我认为只需要进行类型转换即可,但它并不有效:

char * pch2;
//Code that puts something in pc2
part1 = (unsigned char) pch2;

I've the code to this:

result.part1 = (unsigned char *) pch2;
printf("STRUCT %s\n",result.part1);

结果只是一个由无符号字符数组组成的结构体。

编辑:

            pch2 = strtok( ip, "." );

            while( pch2 != NULL ){
                printf( "x %d x: %s\n", i, pch2 );
                pch2[size-1] = '\0';

                if(i == 1)
                    result.part1 = (unsigned char *) pch2;
                if(i == 2)
                    result.part2 = (unsigned char *) pch2;
                if(i == 3)
                    result.part3 = (unsigned char *) pch2;
                if(i == 4)
                    result.part4 = (unsigned char *) pch2;
                i++;
                pch2 = strtok (NULL,".");
            }   
            printf("STRUCT %c\n",result.part1);

结构体:

typedef struct
{
    unsigned char part1;
    unsigned char part2;
    unsigned char part3;
    unsigned char part4;
} res;

2
在您的标题中,您要求一个数组,在您的文本中要求一个变量,大多数答案都向您展示如何获得无符号字符指针。这是哪一个? - dmckee --- ex-moderator kitten
我有一个指针,我想将其转换为无符号字符数组? - user1007522
5个回答

3

您将类型转换为unsigned char而不是unsigned char*,您忘记了*

part1 = (unsigned char*) pch2;

如果 pch2 没有以 null 结尾,那么当你使用 strlen 时会导致程序崩溃,如果你很幸运的话。因此,在使用 pch2 打印之前,需要先将其以 null 结尾。请尝试使用以下代码代替:
pch2[size-1] = '\0';  /* note single quote */
result.part1 = (unsigned char *) pch2;

更新:按照以下方式定义你的结构:
typedef struct
{
    const char *part1;
    const char *part2
    const char *part3;
    const char *part4;
} res;

而且可以直接分配给它,而不需要进行任何类型转换:

result.part1 = pch2;

当将程序打印为字符串时,程序停止运行? - user1007522
@user1007522:你可以使用%c打印单个字符。例如:printf("STRUCT %c\n", *result.part1); - Lie Ryan
@user1007522 不,你需要用NULL来终止字符串 pch2[size-1]=0 - iabdalkader
检查我的编辑代码。(我写了size,但那一定是其他东西,比如strlen,但它不行。) - user1007522
@user1007522 我明白了,不需要在strtok返回的字符串上添加空字符,因为它们已经被添加了。你有初始化变量i吗?在循环之前要将其设置为i=1吗? - iabdalkader
显示剩余8条评论

1
尝试类似这样的东西:
 char *ph2;
 unsigned char *new_pointer = (unsigned char*) ph2;

我已经做过了,但是当执行 printf %s 后程序停止了?这是 strtok 的问题吗,因为 pch2 是由 strtok 初始化的? - user1007522
你可以尝试使用printf("STRUCT %c\n",result.part1); - Rahul Tripathi

1

您想要做这件事:

part1 = (unsigned char*) pch2;

改为:

part1 = (unsigned char) pch2;

1
我想将一个字符指针转换为无符号字符变量。
你确定吗?将指向字符的指针转换为无符号字符不会有任何好处 - 值将被截断为1个字节,并且无论如何都没有意义。也许你想要解引用指针并获取它指向的值 - 那么你应该像这样做:
unsigned char part1 = (unsigned char)*pch2;

在您的编辑后,我看到part1是字符数组 - 如果您的程序在使用后崩溃,那么您可能填充了pch2不正确。也许您忘记了'\0'终止符?

编辑:

您看,现在回答您的问题要求所有必需的信息会更好。您需要使用strtok吗?这个好吗?

    res result;
    char* ip = "123.23.56.33";

    sscanf(ip, "%hhu.%hhu.%hhu.%hhu", &result.part1, &result.part2, &result.part3, &result.part4);

我已经编辑了代码,终止了字符数组,就像你看到的pch2的第一个打印一样完美。但最后一个不行 :( - user1007522
这里的关键点是 - pch2 指向什么以及它是如何到达那里的。如果不知道这一点,我们无法确定它是否构造正确。您终止字符串的方式是错误的 - "\0" 绝对不应该 出现在那里,而且您可能会在错误的字符串上调用 strlen。我们需要知道 pch2 指向的值是什么。 - Maciek
不,我可以使用sscanf,但是当复制您的行时代码会崩溃。此外,我的结构体不是unsigned char * x,而只是unsigned char x,或者这与地址运算符无关。 - user1007522
它在sscanf上崩溃了。但是ip缓冲区不是指针缓冲区,而是一个字符数组,但我认为这并没有什么区别? - user1007522
只有当数组足够大且数据不超出其边界时,它才应该是可以的。您需要确保数组可以容纳IP地址和空终止符的所有字符,并确保IP字符串已空终止。这个数组有多大?IP地址中存储了多少个字符?您能检查一下sscanf是否与某些文字值一起使用吗?当您从我的示例中复制完全相同的三行时,它是否会崩溃? - Maciek
显示剩余3条评论

0
发现问题了,忘记将字符pch2转换为无符号整数,然后我可以使用%u打印输出。 代码:
unsigned int temp;

temp = atoi(pch2);

result.part1 = temp;
printf("Struct: %u\n",result.part1);

谢谢你们的帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接