gpt4 book ai didi

c++ - C++ strtok跳过第二个标记或连续的定界符

转载 作者:行者123 更新时间:2023-11-30 16:27:42 27 4
gpt4 key购买 nike

我正在尝试读取CSV逗号分隔文件,文件内容为

      one,,three


读取文件的代码是这个…

      inFile.getline(line, 500);                            
token1 = strtok(line, ",");
token2 = strtok(NULL, ",");
token3 = strtok(NULL, ",");

if(token1 != NULL){
cout << "token1 = " << token1 << "\n";
}else{
cout << "token1 = null\n" ;
}
if(token2 != NULL){
cout << "token2 = " << token2 << "\n";
}else{
cout << "token2 = null\n" ;
}
if(token3 != NULL){
cout << "token3 = " << token3 << "\n";
}else{
cout << "token3 = null\n";
}


输出是这个

token1 = one
token2 = three
token3 = null


我的期望是输出应该是这样的……

token1 = one
token2 = null
token3 = three


我确实改变了如果从

     if(token1 != NULL) 




     if(token1)


但是它也不起作用。

检查此示例 http://www.cplusplus.com/reference/cstring/strtok/后,我已更新

   token2 = strtok(NULL, ",");




   token2 = strtok(NULL, ",,");


同样它不起作用

最佳答案

一旦我确实在读取CSV逗号分隔文件时遇到了这个问题。但是对于定界符连续出现的此类问题,我们不能使用strtok()作为解决方案。因为按照标准


  序列中的第一个调用搜索字符串
      s1指向的第一个字符不是
      包含在当前由s2指向的分隔符字符串中。
      如果找不到这样的字符,则没有令牌
      s1指向的字符串,strtok函数返回
      空指针。如果找到这样的字符,那就是
      第一个令牌的开始。 C11§7.24.5.83


因此,对于我来说,我使用strpbrk()函数定义了另一个解决方案,这对您也将很有用。

#include<iostream.h>

char *strtok_new(char * string, char const * delimiter){
static char *source = NULL;
char *p, *riturn = 0;
if(string != NULL) source = string;
if(source == NULL) return NULL;

if((p = strpbrk (source, delimiter)) != NULL) {
*p = 0;
riturn = source;
source = ++p;
}
return riturn;
}

int main(){
char string[] = "one,,three,";
char delimiter[] = ",";
char * p = strtok_new(string, delimiter);

while(p){
if(*p) cout << p << endl;
else cout << "No data" << endl;
p = strtok_new(NULL, delimiter);
}
system("pause");
return 0;
}


输出量

one
No data
three


希望这是您想要的输出。

关于c++ - C++ strtok跳过第二个标记或连续的定界符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52653896/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com