首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C中使用字符串?

如何在C中使用字符串?
EN

Stack Overflow用户
提问于 2018-02-21 07:50:49
回答 1查看 108关注 0票数 1

我正在努力学习如何编写现代程序。我想将二进制数据存储在字符串中,然后输出它。为什么?例如,我希望将整个文件读取为一个字符串,然后将其输出到stdout。

我该怎么做呢?并将停止输出数据放在第一个\0之后

我应该用什么来存储文件名,这样我才能使用国际字符?wchar_t?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-21 08:11:13

假设你有一个二进制文件。假设您想从文件中读取8个字节。

代码语言:javascript
复制
FILE *fp = fopen("a", "rb");

if(fp == NULL)
    return;

unsigned char bytes[8];
if(fread(bytes, sizeof bytes / sizeof *bytes, 1, fp) != 1)
{
    fprintf(stderr, "could not read 8 bytes\n");
    return;
}

// printing the bytes:

for(size_t i = 0; i < sizeof bytes / sizeof *bytes; ++i)
    printf("%02X ", bytes[i]);

puts("");

fclose(fp);

我运行这段代码,读取这段代码的编译后的二进制文件(文件名是a),前8个字节是:

代码语言:javascript
复制
7F 45 4C 46 02 01 01 00

正如您所看到的,有些字节没有表示形式,如果我将其打印为字符串,结果将是:

这不太有用,在这里我很幸运,至少有可打印的整数。

如果您还想打印可打印的字符(就像十六进制编辑器一样):

代码语言:javascript
复制
size_t n;
// yes I swapped the number of items and the number of bytes here
// for reading the whole file
while((n = fread(bytes, 1, sizeof bytes / sizeof *bytes, fp)))
{
    size_t i;
    for(i = 0; i < n; ++i)
        printf("%02X ", bytes[i]);

    // if less than array size bytes read, to align output
    printf("%*s", (int) ((sizeof bytes / sizeof *bytes) - i)*3, "");
    printf("%10s |", "");

    for(i = 0; i < n; ++i)
    {
        if(isprint(bytes[i])) 
            printf("%c", bytes[i]);
        else
            printf(".");
    }

    // same here as above
    printf("%*s", (int) ((sizeof bytes / sizeof *bytes) - i), "");
    puts("|");
}

这将输出以下内容:

代码语言:javascript
复制
7F 45 4C 46 02 01 01 00            |.ELF....|
00 00 00 00 00 00 00 00            |........|
03 00 3E 00 01 00 00 00            |..>.....|
A0 07 00 00 00 00 00 00            |........|
40 00 00 00 00 00 00 00            |@.......|
F0 23 00 00 00 00 00 00            |.#......|
00 00 00 00 40 00 38 00            |....@.8.|
09 00 40 00 23 00 22 00            |..@.#.".|
...
00 6C 69 62 63 2E 73 6F            |.libc.so|
2E 36 00 66 6F 70 65 6E            |.6.fopen|
00 70 75 74 73 00 5F 5F            |.puts.__|
73 74 61 63 6B 5F 63 68            |stack_ch|
6B 5F 66 61 69 6C 00 70            |k_fail.p|
75 74 63 68 61 72 00 70            |utchar.p|
72 69 6E 74 66 00 66 63            |rintf.fc|
6C 6F 73 65 00 5F 5F 63            |lose.__c|
74 79 70 65 5F 62 5F 6C            |type_b_l|
...
39 01 00 00 00 00 00 00            |9.......|
00 00 00 00 00 00 00 00            |........|
01 00 00 00 00 00 00 00            |........|
00 00 00 00 00 00 00 00            |........|
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48896082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档