为什么我的8位指针不能正确更新?

时间:2019-04-06 03:51:24

标签: c

方向在这里:

我应该在完全相同的输入缓冲区(在本例中为pt1)中转换ASCII字符串。 对我来说不幸的是,循环仅执行一次,因此我的输出缓冲区仅包含第一个short值。

我正在尝试将ASCII字符串转换为Unicode 16位字符串。根据指示,pt1应该指向ASCII字符串。 预期输出在此链接上。 https://i.stack.imgur.com/COpXl.jpg

void Convert(unsigned short *pt1) { 
    // pt1 is a pointer to a null-terminated variable length ASCII string
    // 0x30 0x31 0x32 0x00 (sentinel value)
    unsigned char *pt2 = (unsigned char *)pt1;
    unsigned char value = *pt2;
    while (*pt2 != 0x00) {
        value = *pt2;
        *pt1 = (unsigned short)value;
        pt2++;
        pt1++;
    }
    *pt1 = 0x0000;
}

1 个答案:

答案 0 :(得分:2)

存在多个问题:

  • 您的转换函数不会产生任何对调用方可见的内容:将代码点值存储在本地数组中并返回给调用方。编译器警告您至少设置pt3且不使用,但更高级的编译器将为此功能优化所有代码,而没有副作用。
  • Convert的API描述是什么?您似乎收到了一个伪装为unsigned short指针的ASCII字符串指针,并且似乎应该在适当的位置执行转换。如果这是实际要求,那是一个非常糟糕的主意。该函数应该收到指向类型为unsigned short *的目标数组的指针,指定该数组元素数的size_t和类型为const char *的源字符串的指针。
  • 应如何处理ASCII范围以外的字节?源字符串是否在给定的代码页中编码?它是UTF-8编码的吗?该功能是否应该报告错误?

在EDIT中,您似乎确认了疯狂的API要求。假设参数数组中有足够的空间,则应执行从最后一个字节到第一个字节的转换,从而避免踩到自己的脚趾:

void Convert(unsigned short *pt1) { 
    // pt1 is a pointer to a null-terminated variable length ASCII string
    // with enough space to receive the converted value including a null terminator
    unsigned char *pt2 = (unsigned char *)pt1;
    size_t i;
    // Compute the number of bytes
    for (i = 0; pt2[i] != '\0'; i++)
        continue;
    // Convert the contents from right to left
    // Assuming ISO8859-1 encoding for bytes outside the ASCII range
    for (;;) {
        pt1[i] = (unsigned short)pt2[i];
        if (i-- == 0)
            break;
    }
}