【问题标题】:strtok not discarding the newline characterstrtok 不丢弃换行符
【发布时间】:2013-05-21 19:17:33
【问题描述】:

所以我有一个包含一堆名称和数字的输入文件。我开始使用 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,而不是在名称之后。有人可以向我解释如何解决这个问题吗?

【问题讨论】:

标签: c


【解决方案1】:

将 \r \n 或者 \t 添加到您的 strtok 分隔符列表中

【讨论】:

    【解决方案2】:

    在标记temp之前,去掉换行符如下:

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

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

    【讨论】:

    • 或者将\n添加到分隔符列表中;那么就不需要单独扫描输入行了。
    • @John Bode:这是一个性能打击。您将扫描字符串两次,一次用于 \n,另一次用于标记。虽然 Java 和 C# 程序员这样做是完全正常的,但我们 C++ 程序员更清楚:)
    • 那里也可能有一个\r,就像在CR LF中一样
    • @JonathanLeffler:或者,也一样。
    • @AlexK:鉴于此代码受 I/O 限制,我不太担心额外的扫描。
    【解决方案3】:

    根据man fgets

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

    这就是您获取换行符的地方。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      相关资源
      最近更新 更多