2011-03-10 77 views
0

我有以下功能:如何打印包含特殊字符并从文件中读取的字符串?如何打印没有特殊字符?

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

您的意思是它真的打印出“Hello World \ n”,即反斜杠和n?这不会发生,因为\ n在编译时被替换为char(13)。 – sashoalm 2011-03-10 10:04:02

+0

@satuon:不,它发生,因为我从文件中读取这样的字符串 – psihodelia 2011-03-10 10:04:47

+0

不是Pascal类型的字符串,它们的长度在'[0]'中指定了吗? – 2011-03-10 10:05:01

回答

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

,现在它的工作吧!

+0

ok ......但是“错误的”组合完全不会打印出您的代码:“foo \ bar”会打印出“ fooar“(没关系!我只是提出来!)你可以编写代码来忽略'\'(打印”foobar“)或打印所有内容(”foo \ bar“)。 – pmg 2011-03-10 10:56:34

2

没有错,但我猜\n本质上是在字符串中。当您在C/C++程序的字符串中编写\n时,编译器将用正确的换行符替换它。但是,如果\n在您的文本中(主要是"\\n"),则不会发生这种情况。

字符串集在哪里?看起来你可能不得不自己处理逃脱的角色。

Btw。这取决于你的编译器,你应该能够使用这样的事情,这是很多simplier:

printf("%*s", length, s); 

编辑: 刚才看了你上面的评论。如果您从文件中读取字符串,则必须自己处理\n - >换行符替换。 printf()将不会为您处理。

+0

请阅读我更新过的原始问题。我没有C型字符串,它不是以空字符结尾的字符串。 – psihodelia 2011-03-10 10:08:36

+0

我知道,格式字符串中的*表示编译器从下一个参数读取长度。该字符串不必为null才能工作。 – Mario 2011-03-10 10:09:45

+0

@Mario:我有printf函数,它不支持它(因为它是为一个特殊的嵌入式系统) – psihodelia 2011-03-10 10:10:44

1

特殊字符由编译器处理,而不是由printf处理。他们在编译时被转换,所以

char a[] = "a\n"; 

变得相当于

char a[] = { 'a', 13, 0 }; 

的printf从未看到 “\ n”,编译器已经完成转换的13事前。 而printf不能转换特殊字符。当你从一个文件中读取“Hello World \ n”时,你不能指望它被编译器转换。