[英]How can I make strtok include newlines at the end of a token?
在我正在編寫的程序中,我需要能夠將輸入文本文件標記為單詞,進行一些編碼,然后寫入輸出文件。 問題是,我需要保留新行。
我嘗試的方法是讓strtok在一個單詞的末尾保留換行符,但是,strtok在繼續之前只會包含一個換行符。 如果后面有換行符,它將成為其自己的令牌。 如何更改此行為,使標記在移至下一個單詞之前包含所有換行符?
int changeNewLine(char* p) {
p = p + (strlen(p)-1);
int newlines = 0;
while(*p == '\n') {
*p = '\0';
newlines++;
p--;
}
return newlines;
}
void main(int argc, char *argv[]) {
FILE *inputfile = fopen(argv[1],"rw");
FILE *outputfile = fopen("output.txt","wb");
char buffer[128];
char *token;
char words[MAX_CODE][WORDLEN];
int i = 0;
unsigned short newlines[MAX_CODE];
while(fgets(buffer, 128, inputfile)){
token = strtok(buffer," ");
while(token != NULL) {
newlines[i] = changeNewLine(token);
strcpy(words[i], token);
i++;
token = strtok(NULL," ");
}
}
...
}
上面是我的代碼片段。 這個想法是計算令牌中換行符的數量,然后稍后將它們寫回。
由於您使用的分隔符字符串不包含換行符,因此strtok
已經在令牌中包括了換行符。 但是,在現在的程序中,令牌中最多不會有一個令牌,因為fgets
一次最多讀取(一行)一行。 這就是它的全部目的。 它永遠不會給您一個包含兩個或多個換行符的字符串,也不會包含除最后一個字符以外的任何地方的換行符。
您的一般選擇是
備選方案(1)也可以包括采用完全不同的方法來讀取輸入,例如,使用fread()
讀取的塊或使用fgetc()
的一次讀取字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.