2013-03-15 87 views
0

我想用fgets()來簡單地讀一行並去掉換行符。這是否適用於Windows和UN * X上的所有情況?跨平臺使用fgets()?

fgets(buf, sizeof buf, stdin); 
strtok(buf, "\r\n"); 

請不要推薦非標準的東西,比如GNU的getline()。提前致謝!

回答

4

沒有,如果你想跨平臺,做正確:

您可以在運行問題讀數窗創建於UNIX 文件時(例如),但會爲工作的預期目的,修改標準輸入。

如果你擔心多次調用strlen

fgets (buf, sizeof (buf), stdin); 
{ 
    size_t len = strlen (buf); 
    if (len > 0) 
     if (buf[len - 1] == '\n') 
      buf[len - 1] = '\0'; 
} 

順便說一句,如果你正在尋找一個強大的線路輸入解決方案,它不換行去除,緩衝區溢出檢測,多餘的行清理,只使用標準C,你應該看看this answer

+1

不會在字符串的末尾留下一個'\ r'在Windows的情況下,結束每行'\ r'後跟'\ n'?另外,爲什麼有必要用if語句和兩個對strlen()的調用來將單個調用替換爲strtok()? – Derek 2013-03-15 04:12:40

+0

@Derek,不,Windows在輸入行時(至少對於文本文件)不會在行的末尾放置'\ r'。對於文件,實施需要處理翻譯。在stdin的情況下,由於沒有辦法來自不同平臺的輸入,所以你的麻煩更小:-)嘗試一下,親自查看。如果你擔心性能,你可以緩存'strlen'的結果,但現代編譯器往往會使這不必要。 – paxdiablo 2013-03-15 04:14:22

+0

爲什麼我上面的代碼不正確? – Derek 2013-03-15 04:18:36

2

不,新行的內部(解釋)表示總是'\ n'。所以:

strtok(buf, "\n"); 

一般情況下,一個文件需要在文本模式下被打開並換行轉換爲自動工作:

text = fopen("text", "r"); // Conversion works 
binary = fopen("binary", "rb"); // Won't work 
+0

雙倍於'stdin',這應該是文本模式(對於那些作出區分的操作系統)。 – paxdiablo 2013-03-15 04:32:11

0

謝謝,夥計們。結束寫這個包裝:

void 
getstr(char *s, size_t n) 
{ 
    int c; 

    if (fgets(s, n, stdin) != NULL) { 
     if (s[strlen(s) - 1] == '\n') 
      s[strlen(s) - 1] = '\0'; 
     else 
      while ((c = getchar()) != EOF && c != '\n') 
       ; 
    } 
}