使用制表符拆分字符串但缺少某些信息
Split Strings with Tabs but Some Info is Missing
我正在从遵循以下模式的文本文件中读取信息: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(ptr, "\t") 与 strtok(ptr, "\t\t").
相同
在那种情况下,我更喜欢内部带有 memcpy(s, p1, p2-p1) 的“p2 = strchr(p1, '\t')”循环。
顺便说一句,strtok 不可重入。使用(顺便说一句:可重入与多线程无关。strtok 已经打破了嵌套循环。可以使用 strtok_r 但它不那么便携。)
我正在从遵循以下模式的文本文件中读取信息: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(ptr, "\t") 与 strtok(ptr, "\t\t").
相同在那种情况下,我更喜欢内部带有 memcpy(s, p1, p2-p1) 的“p2 = strchr(p1, '\t')”循环。
顺便说一句,strtok 不可重入。使用(顺便说一句:可重入与多线程无关。strtok 已经打破了嵌套循环。可以使用 strtok_r 但它不那么便携。)