我想用fgets()
來簡單地讀一行並去掉換行符。這是否適用於Windows和UN * X上的所有情況?跨平臺使用fgets()?
fgets(buf, sizeof buf, stdin);
strtok(buf, "\r\n");
請不要推薦非標準的東西,比如GNU的getline()。提前致謝!
我想用fgets()
來簡單地讀一行並去掉換行符。這是否適用於Windows和UN * X上的所有情況?跨平臺使用fgets()?
fgets(buf, sizeof buf, stdin);
strtok(buf, "\r\n");
請不要推薦非標準的東西,比如GNU的getline()。提前致謝!
沒有,如果你想跨平臺,做正確:
您可以在運行問題讀數窗創建於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。
不,新行的內部(解釋)表示總是'\ n'。所以:
strtok(buf, "\n");
一般情況下,一個文件需要在文本模式下被打開並換行轉換爲自動工作:
text = fopen("text", "r"); // Conversion works
binary = fopen("binary", "rb"); // Won't work
雙倍於'stdin',這應該是文本模式(對於那些作出區分的操作系統)。 – paxdiablo 2013-03-15 04:32:11
謝謝,夥計們。結束寫這個包裝:
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')
;
}
}
不會在字符串的末尾留下一個'\ r'在Windows的情況下,結束每行'\ r'後跟'\ n'?另外,爲什麼有必要用if語句和兩個對strlen()的調用來將單個調用替換爲strtok()? – Derek 2013-03-15 04:12:40
@Derek,不,Windows在輸入行時(至少對於文本文件)不會在行的末尾放置'\ r'。對於文件,實施需要處理翻譯。在stdin的情況下,由於沒有辦法來自不同平臺的輸入,所以你的麻煩更小:-)嘗試一下,親自查看。如果你擔心性能,你可以緩存'strlen'的結果,但現代編譯器往往會使這不必要。 – paxdiablo 2013-03-15 04:14:22
爲什麼我上面的代碼不正確? – Derek 2013-03-15 04:18:36