C 如何使strtok在令牌末尾包含换行符?
在我正在编写的程序中,我需要能够将输入文本文件标记为单词,进行一些编码,然后写入输出文件。问题是,我需要保留新线 我尝试的方法是让strtok保留单词末尾的换行符,但是,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
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?