C strtok不丢弃换行符

C strtok不丢弃换行符,c,C,我有一个输入文件,里面有一堆名字和数字。我开始使用strtok分解字符串,以便从每个字符串中提取所有数据。一切似乎都正常工作,但出于某种原因,它并没有丢弃换行符 int procFile(PERSON **data, FILE* fpFile) { // Local Declaration char temp[1000]; char proc[15]; char *entry; char *loc; int success = 0; // Statement if(fgets(temp,

我有一个输入文件,里面有一堆名字和数字。我开始使用strtok分解字符串,以便从每个字符串中提取所有数据。一切似乎都正常工作,但出于某种原因,它并没有丢弃换行符

int procFile(PERSON **data, FILE* fpFile)
{
//  Local Declaration
char temp[1000];
char proc[15];
char *entry;
char *loc;
int success = 0;

//  Statement
if(fgets(temp, sizeof(temp), fpFile))
{
    (*data) = aloMem(); // free
    entry = temp;
    loc = strtok(entry, " ()-");
    strcpy(proc, loc);
    loc = strtok(NULL, " ()-");
    strcat(proc, loc);
    loc = strtok(NULL, " ()-");
    strcat(proc, loc);
    sscanf(proc, "%ld", &(*data)->phone);
    loc = strtok(NULL, "\0");
    strcpy((*data)->name, loc);
    success++;
    printf("%s1", (*data)->name);
}

return success;
}// procFile
我试着打印结果,看看它是否工作正常,这是我的输出

Brown, Joanne
1South, Frankie
1Lee, Marie
1Brown, Joanne
1Trapp, Ada Eve
1Trapp, David
1White, D. Robert
1Lee, Victoria
1Marcus, Johnathan
1Walljasper, Bryan
1Trapp, Ada Eve
1Brown, Joanne
1Andrews, Daniel

它在换行符上的每个名称后面打印
1
,而不是在名称后面。有人能给我解释一下如何解决这个问题吗?

根据
man fgets

fgets()从流中最多读入一个小于大小的字符,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止如果读取换行符,则将其存储到缓冲区中


这就是你的新词来源

在标记化
temp
之前,按如下方式删除换行符:

char *newline = strchr( temp, '\n' );
if ( newline )
  *newline = 0;

strchr
搜索
temp
换行符,并返回指向它的指针(如果找不到换行符,则返回NULL)。然后用0(字符串终止符)覆盖换行符

在strtok中添加\r\n或者\t分隔符列表

或者在分隔符列表中添加
\n
;那么就不需要对输入行进行单独扫描了。@John Bode:这是一个性能上的成功。您将扫描字符串两次,一次扫描\n,另一次扫描令牌。虽然java和C++程序员完全可以正常工作,但是C++程序员知道得更好:LF@JonathanLeffler:或者,这也是。@AlexK:鉴于此代码是I/O绑定的,我不太担心额外的扫描。删除尾随空白可以通过使用
strpbrk()
来实现: