相关疑难解决方法(0)

unsigned char的格式说明符

说我要打印unsigned char:

unsigned char x = 12;
Run Code Online (Sandbox Code Playgroud)

哪个是对的.这个:

printf("%d",x);
Run Code Online (Sandbox Code Playgroud)

或这个:

printf("%u",x);
Run Code Online (Sandbox Code Playgroud)

事情就在其他地方我遇到过这样的讨论:

- 即使ch更改为unsigned char,代码的行为也不是由C标准定义的.这是因为unsigned char被提升为int(在普通的C实现中),因此将int传递给printf以获取指定符%u.但是,%u期望unsigned int,因此类型不匹配,并且C标准不定义行为

- 你的评论不正确.C11标准规定转换说明符必须与函数参数本身的类型相同,而不是提升类型.hh length修饰符的描述中也明确说明了这一点:"参数将根据整数提升进行提升,但其值应在打印前转换为signed char或unsigned char"

哪个是正确的?任何可靠的消息来源都说这个问题?(从这个意义上说,我们也应该unsigned short用%d 打印int,因为它可以被提升为int?).

c

12
推荐指数
2
解决办法
3万
查看次数

printf从char数组中添加额外的`FFFFFF`到十六进制打印

请考虑以下简化代码.我想从文件中提取一些二进制数据/流,并以十六进制格式将其打印到标准输出.

我有额外的3个字节0xFFFFFF.怎么了?额外的字节来自哪里?

产量

in:
        2000FFFFFFAF00690033005A00
out:
        2000FFFFFFAF00690033005A00
Run Code Online (Sandbox Code Playgroud)

program.c

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

int main(int argc, char** argv) {

    int i;
    char raw[10] = {0x20,0x00,0xAF,0x00,0x69,0x00,0x33,0x00,0x5A,0x00};
    FILE *outfile;
    char *buf;

    printf("in:\n\t");
    for( i=0; i<10; i++ )
        printf("%02X", raw[i]);

    outfile = fopen("raw_data.bin", "w+b");

    fwrite(raw, 1, 10, outfile);

    buf = (char *) malloc (32 * sizeof(char));
    fseek(outfile, 0, SEEK_SET);
    fread(buf, 1, 10, outfile);

    printf("\nout:\n\t");
    for( i=0; i<10; i++ )
        printf("%02X", buf[i]);

    printf("\n");

    fclose(outfile);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c arrays printf

12
推荐指数
2
解决办法
1万
查看次数

memcpy将ff ff ff添加到一个字节的开头

我有一个这样的数组:

unsigned char array[] = {'\xc0', '\x3f', '\x0e', '\x54', '\xe5', '\x20'};
unsigned char array2[6];
Run Code Online (Sandbox Code Playgroud)

当我使用memcpy时:

memcpy(array2, array, 6);
Run Code Online (Sandbox Code Playgroud)

并打印它们:

printf("%x %x %x %x %x %x", array[0],  // ... etc
printf("%x %x %x %x %x %x", array2[0], // ... etc
Run Code Online (Sandbox Code Playgroud)

一个打印像:

c0 3f e 54 e5 20
Run Code Online (Sandbox Code Playgroud)

但另一个打印

ffffffc0 3f e 54 ffffffe5 20
Run Code Online (Sandbox Code Playgroud)

发生了什么?

c++ memcpy

7
推荐指数
2
解决办法
1751
查看次数

使用%x打印十六进制值时,为什么在每个值后打印'ffffff'?

在示例c ++代码中,我将打开一个文件并打印六进制文件中的每个字符只有16个字符,但为什么ffffff会在每个heax值后打印?

char buff[256];
// buff filled with fread
for(i=0;i<16;i++)
printf("%x",buff[i]);
Run Code Online (Sandbox Code Playgroud)

输出是:

4affffff67ffffffcdffffff
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

c++

7
推荐指数
1
解决办法
1万
查看次数

使用printf以十六进制格式打印字符串,结果失真

我想以十六进制格式打印字符串,

在机器A上,类似于

ori_mesg = gen_rdm_bytestream (1400,seed)
sendto(machine B, ori_mesg, len(mesg))
Run Code Online (Sandbox Code Playgroud)

在机器B上

 recvfrom(machine A, mesg)

mesg_check = gen_rdm_bytestream (1400, seed)

            for(i=0;i<20;i++){
                    printf("%02x ", *(mesg+i)& 0xFF);
            }
            printf("\n");
            for(i=0;i<20;i++){
                    printf("%02x ", *(mesg_check+i));
            }
            printf("\n");
Run Code Online (Sandbox Code Playgroud)

seed 在1,2,3之间变化....

字节生成函数是:

u_char *gen_rdm_bytestream (size_t num_bytes, unsigned int seed)
{
    u_char *stream = malloc (num_bytes+4);
    size_t i;

    u_int16_t seq = seed;
    seq = htons(seq);
    u_int16_t tail = num_bytes;
    tail = htons(tail);
    memcpy(stream, &seq, sizeof(seq));
    srand(seed);
    for (i = 3; i < num_bytes+2; i++){
            stream[i] = rand (); …
Run Code Online (Sandbox Code Playgroud)

c printf

4
推荐指数
1
解决办法
7万
查看次数

为什么`strchr`似乎与多字节字符一起工作,尽管手册免责声明?

从:

man strchr
Run Code Online (Sandbox Code Playgroud)

char*strchr(const char*s,int c);

strchr()函数返回指向字符串s中第一次出现的字符c的指针.

这里"字符"表示"字节"; 这些函数不适用于宽字符或多字节字符.

如果我尝试搜索多字节字符é(0xC3A9在UTF-8中):

const char str[] = "This string contains é which is a multi-byte character";
char * pos = strchr(str, (int)'é');
printf("%s\n", pos);
printf("0x%X 0x%X\n", pos[-1], pos[0]); 
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

这是一个多字节字符

0xFFFFFFC3 0xFFFFFFA9

尽管有警告:

警告:多字符字符常量[-Wmultichar]

所以这是我的问题:

  • 这意味着什么不适strchr用于多字节字符?(它似乎工作,只要int类型足够大,包含你的多字节,最多4个字节)
  • 如何摆脱警告,即如何安全地恢复多字节值并将其存储在int中?
  • 为什么是前缀0xFFFFFF

c string wchar-t utf-8

4
推荐指数
1
解决办法
622
查看次数

C - 以十六进制打印出一个字符指针给了我奇怪的结果

所以我正在编写一个非常小而简单的程序,它将一个数字作为输入,将其转换为十六进制,然后一次打印出两个字符。

对于某些数字,它会在输出前打印出 ffffff。

这是我的代码:

    //Convert the input to an unsigned int
unsigned int a = strtoul (argv[1], NULL, 0);
//Convert the unsigned int to a char pointer
char* c = (char*) &a;

//Print out the char two at a time
for(int i = 0; i < 4; i++){
    printf("%02x ", c[i]);
}
Run Code Online (Sandbox Code Playgroud)

大多数输出​​都很好,看起来像这样:

./hex_int 1

01 00 00 00
Run Code Online (Sandbox Code Playgroud)

但是对于某些数字,输出如下所示:

./hex_int 100000

ffffffa0 ffffff86 01 00
Run Code Online (Sandbox Code Playgroud)

如果您删除所有 f,则转换是正确的,但我无法弄清楚为什么它仅在某些输入上执行此操作。

谁有想法?

c

3
推荐指数
1
解决办法
4623
查看次数

标签 统计

c ×5

c++ ×2

printf ×2

arrays ×1

memcpy ×1

string ×1

utf-8 ×1

wchar-t ×1