我的问题是,当我尝试用“\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/