【问题标题】:why are there 3 undesired characters in the beginning of the string in C language?为什么C语言字符串的开头有3个不需要的字符?
【发布时间】:2022-01-24 10:41:39
【问题描述】:

我遇到了这个 C 程序的问题,它读取文件的内容并将其复制到字符串中,然后打印出来。 当我分配一个字符串时,它总是有 3 个奇怪的字符,我可以通过将 '\0' 放在开头来将其初始化为一个空字符串来解决这个问题,如第 1 部分和第 2 部分所示。 但是在读取文件时,即使使用这种技术,也不会出现 3 个字符,如第 3 部分所示。

任何人都知道为什么要打印这 3 个字符,知道如果我将字符串复制到另一个文件中,它们不会出现在其中;为什么当我阅读文件时它们仍然出现?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define length 20

int main() { /////////PART 1

    char *T = (char*) malloc((length+1)*sizeof(char)) ;
    printf("%s\n", T); 

    strcat(T,  "hello") ;
    printf("%s\n", T); 

////////////////////////////////////PART 2  

    char *M = (char*) malloc((length+1)*sizeof(char)) ; M[0] = '\0' ;
    printf("%s\n", M);

    strcat(M,  "hello") ;
    printf("%s\n", M); 

////////////////////////////////////PART 3 

    FILE *fil = fopen("test.txt", "r") ;
    char *S = (char*) malloc((length+1)*sizeof(char)) ; S[0] = '\0' ;


    fread(S, sizeof(char), length, fil); 
    S[length] = '\0' ;

    printf("%s\n", S) ;
    fclose(fil) ;
}

【问题讨论】:

  • 永远不要假设malloc返回的内存内容。
  • 如果你想初始化内存使用 calloc:char *t = calloc(length+1, 1)。如果 t 不为 NULL(请务必检查),它指向的内存将被设置为全零。
  • strcat(T, "hello") ; 在初始化T 之前你不能这样做。您需要像在其他示例中一样,在调用 strcpy 之前将手动空终止符附加到索引 0
  • 如果它只发生在第 3 部分,在读取该特定文件后(您说如果将文本复制到另一个文件就不会发生),该文件可能会以字符编码 UTF- 8 物料清单。这有一个 3 个字符的签名。这意味着这三个字符是文件的一部分,而不是 malloc 的错误。
  • 试试printf(%x %x %x\n", S[0], S[1], S[2]);。如果你得到ef bb bf,那就是Byte Order Mark

标签: c string dynamic-memory-allocation


【解决方案1】:

这 3 个字符可以是  还是 ´╗┐?在 unicode 文本文件的开头添加字节顺序标记是很常见的。 BOM 是魔法值 0xfeff。

在 UTF-8 编码文件上,它是 3 个字节 "\xef\xbb\xbf",在 UTF-16 Little Endian 上,它是 2 个字节 "\xff\xfe",在 UTF-16 Big Endian 上,它是 2 个字节 @ 987654325@.

如果您正在读取包含 BOM 的文件,则具有这些特殊字符是正常的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多