如何打印包含特殊字符并从文件中读取的字符串?如何打印没有特殊字符?

时间:2011-03-10 10:00:31

标签: c string

我有以下功能:

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 。我的功能出了什么问题?

3 个答案:

答案 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++;
   }
}

现在它确实正常工作!