所以我有一个带有一堆名字和数字的输入文件。我开始使用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
,而不是在名称后面。有人可以向我解释我如何解决问题吗?
答案 0 :(得分:4)
在对temp
进行标记之前,请按以下步骤删除换行符:
char *newline = strchr( temp, '\n' );
if ( newline )
*newline = 0;
strchr
在temp
中搜索换行符,并返回指向它的指针(如果找不到换行符,则返回NULL)。然后我们用0(字符串终止符)覆盖换行符。
答案 1 :(得分:3)
根据man fgets
:
fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。读数在EOF或换行符后停止。 如果读取换行符,则会将其存储到缓冲区。
这就是你从中获取新行的地方。
答案 2 :(得分:3)
将\ r \ n和\ t或\ t添加到strtok
中的分隔符列表中