我有以下功能:
int Printf(const char *s, int length)
{
int i=0;
while(i < length)
{
printf("%c", s[i]);
i++;
}
}
但是如果我用一个非空终止的字符串(例如我从文件中读取的“Hello World \ n”)调用它,它会打印 Hello World \ n 而不会创建新行,所以它明确打印 \ n 。我的功能出了什么问题?
答案 0 :(得分:2)
没有错,但我猜\n
基本上是在字符串中。当您在C / C ++程序的字符串中写入\n
时,编译器将使用正确的换行符替换它。但是,如果\n
在您的文字中(基本上是"\\n"
),则不会发生这种情况。
字符串集在哪里?好像你可能必须自己处理转义的角色。
顺便说一下。根据您的编译器,您应该可以使用这样的东西,这更简单:
printf("%*s", length, s);
编辑:
请阅读上面的评论。您必须处理\n
- &gt;如果从文件中读取字符串,则自行更换换行符。 printf()
不会为您处理。
答案 1 :(得分:1)
特殊字符由编译器处理,而不是由printf处理。它们在编译期间被转换,所以
char a[] = "a\n";
等同于
char a[] = { 'a', 13, 0 };
printf永远不会看到“\ n”,编译器事先已将其转换为13。 并且printf无法转换特殊字符。当您从文件中读取“Hello World \ n”时,您不能指望编译器将其转换。
答案 2 :(得分:1)
我已经重写了我的功能:
int Printf(char *s, int length)
{
int i=0;
char c = '\0',
special='\\',
newline ='n',
creturn ='r',
tab ='t';
while(i < length)
{
if(c == special)
{
if( s[i] == newline )
printf("\n");
else if(s[i] == creturn)
printf("\r");
else if(s[i] == tab)
printf("\t");
else if(s[i] == special)
printf("\\");
}
else if (s[i] != '\\')
printf("%c", s[i]);
c = s[i];
i++;
}
}
现在它确实正常工作!