Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使strtok在令牌末尾包含换行符?_C_String_Ascii_Strtok - Fatal编程技术网

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

C 如何使strtok在令牌末尾包含换行符?,c,string,ascii,strtok,C,String,Ascii,Strtok,在我正在编写的程序中,我需要能够将输入文本文件标记为单词,进行一些编码,然后写入输出文件。问题是,我需要保留新线 我尝试的方法是让strtok保留单词末尾的换行符,但是,strtok在继续之前只包含一个换行符。如果有下面的换行符,它将成为自己的标记。如何更改此行为,使标记在移动到下一个单词之前包含所有换行符 int changeNewLine(char* p) { p = p + (strlen(p)-1); int newlines = 0; while(*p

在我正在编写的程序中,我需要能够将输入文本文件标记为单词,进行一些编码,然后写入输出文件。问题是,我需要保留新线

我尝试的方法是让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()进行字符一次读取,Strtok非常难看,也许可以在循环中使用strspn或strcspn?