【问题标题】:Split Strings with Tabs but Some Info is Missing使用制表符拆分字符串,但缺少一些信息
【发布时间】:2021-03-25 02:35:19
【问题描述】:

我正在从一个遵循以下模式的文本文件中读取信息:Id、JobTitle、BasePay、OvertimePay、Benefit、Status。每个部分由制表符分隔。下面是一行的示例:

81387   Architectural Associate 114146.55   0   0   FT

但是,有些行缺少基本工资,而是有两个制表符,因此看起来像:

81392   Deputy Chief        0   149934.11   FT

当我使用带有“\t”作为分隔符的 strtok 时,它会自动跳过此处的两个制表符并直接变为 0,即 OvertimePay。这是我使用的代码(“current”是我用来存储每条信息的结构,并且 ptr 已经定义为 char 数组):

ptr = strtok(salaryLine, delim);    // This gives us ID, which we already have. Skip this
ptr = strtok(NULL, delim);
strcpy(current.title, ptr);
ptr = strtok(NULL, delim);
current.basePay = strtod(ptr, &empty);   // This is a problem because it takes OvertimePay instead if BasePay is missing
ptr = strtok(NULL, delim);
current.overtimePay = strtod(ptr, &empty);
ptr = strtok(NULL, delim);
current.benefit = strtod(ptr, &empty);
ptr = strtok(NULL, delim);
strtok(ptr, "\n");  // Remove newline character
strcpy(current.status, ptr);

有没有办法可以标记这样的字符串。具体来说,如何找到文件中没有 BasePay 的字符串?我尝试在字符串中搜索两个相邻的制表符,但不起作用。

char* temp = strstr(ptr, "\t\t");
            
if (ptr == NULL)
{
    printf("It's null");
}
            
else
{
    printf("It found it");
}

提前谢谢你。

【问题讨论】:

  • 不要使用 strtok。使用 strchr 等其他方式来查找下一个选项卡。如需进一步帮助,请显示“我已尝试在字符串中搜索两个相邻的制表符”的实际代码。
  • 如您所见,strtok 不适用于您的用例 - 它会跳过多个连续的分隔符实例。请展示您尝试过的其他方式。

标签: c string delimiter strtok


【解决方案1】:

使用多重分隔符没有区别。 strtok(ptr, "\t") 与 strtok(ptr, "\t\t") 相同。

在这种情况下,我更喜欢 "p2 = strchr(p1, '\t')" 循环,里面有一个 memcpy(s, p1, p2-p1)。

顺便说一句,strtok 不可重入。使用(顺便说一句:可重入与多线程无关。strtok 已经与嵌套循环中断。可以使用 strtok_r 但它不那么便携。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多