我的问题是,当我尝试用“\n”打印文本时,这个特殊字符对于 printf 是不可见的,并且在将其回显到文件并再次读取后放置。

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *f;
    char *s = (char*) malloc (2919);
    strcpy(s, "printf 'H4sIAIM4aFYCAwtJLS6JyQsBklwAMrDLnwsAAAA=' | base64 -d | gunzip > r"); //Test\nTest after decoding
    system(s);
    f = fopen("r", "r");
    fseek(f, SEEK_SET, 0);
    fread(s, 2919, 1, f);
    printf("%s", s); //puts(s); gives the same result
    fclose(f);
    system("rm r");
    free(s);
    return 0;
}

输出应如下所示:
Test
Test

它看起来像 Test\nTest 。我究竟做错了什么?
学习目的,所以请善待。

最佳答案

您的代码存在以下问题:

  • fseek(f, SEEK_SET, 0); 没有用,用 fopen 打开的文件默认在位置 0。
  • fread(s, 2919, 1, f); :您不存储读取的字节数。您不能正确地为 printf 终止缓冲区以在最后一个解码字节处停止。你怎么知道文件大小呢?
  • 编码的字符串 H4sIAIM4aFYCAwtJLS6JyQsBklwAMrDLnwsAAAA= 解码为 Test\nTest ,带有一个 \ 字符,后跟一个 n ,而不是换行符。使用 r 从文件 fread 读取这些字符不会将转义序列 \n 转换为实际的换行符。在解析字符串和字 rune 字时,这种转换是编译器的一项功能。如果您打算对文件内容执行此操作,则必须自己手动编码转换。

  • 这是一个更正的版本:
    #include <stdio.h>
    #include <string.h>
    
    int main(void) {
        FILE *f;
        char *s = malloc(2919 + 1);
        char *p;
        int nread;
    
        strcpy(s, "printf 'H4sIAIM4aFYCAwtJLS6JyQsBklwAMrDLnwsAAAA=' | base64 -d | gunzip > r"); //Test\nTest after decoding
        system(s);
        f = fopen("r", "r");
        nread = fread(s, 2919, 1, f);
        if (nread >= 0) {
            s[nread] = '\0';
            while ((p = strstr(s, "\\n")) != NULL) {
                /* converting \ n sequences to linefeed characters */
                *p = '\n';
                memmove(p + 1, p + 2, strlen(p + 2) + 1);
            }
            printf("%s", s); //puts(s); will not give the same result
        }
        fclose(f);
        system("rm r");
        free(s);
        return 0;
    }
    

    关于c - 如何打印带格式的文本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34181239/

    10-11 23:11
    查看更多