簡體   English   中英

如何使strtok在令牌末尾包含換行符?

[英]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. 展望后續行以發現其他換行符,或
  2. 遇到以換行開頭的行(因此,不包含其他任何內容)時,追溯更新前一行的換行計數。

備選方案(1)也可以包括采用完全不同的方法來讀取輸入,例如,使用fread()讀取的塊或使用fgetc()的一次讀取字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM