2011-03-10 105 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」時,你不能指望它被編譯器轉換。