我正在尝试扫描字符串中的单词和数字,如下所示:“ hello,world,I,287876,6.0 ”< - 此字符串存储在{{1}中数组(字符串) 我需要做的是将事情分开并将它们分配给不同的变量,这就像
char
我知道常规scanf在到达空白区域时会停止从标准输入读取。所以我一直在想,有可能让sscanf在达到“,”(逗号)时停止阅读
我一直在探索图书馆,找到sscanf的格式,只读字母和数字。我找不到这样的东西,也许我应该再看一次。
有任何帮助吗? 在此先感谢:)
答案 0 :(得分:13)
如果字符串中变量的顺序是固定的,我的意思是它总是:
string, string, string, int, float
在sscanf()
中使用以下格式说明符:
int len = strlen(str);
char a[len];
char b[len];
char c[len];
unsigned long d;
float e;
sscanf(" %[^,] , %[^,] , %[^,] , %lu , %lf", a, b, c, &d, &e);
答案 1 :(得分:1)
使用strtok
的示例应该会有所帮助:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="hello, world, I, 287876, 6.0" ;
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str,",");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, ",");
}
return 0;
}
答案 2 :(得分:-1)
请参阅strtok
和/或strtok_r
答案 3 :(得分:-1)
假设文本文件的格式不变,则可以使用以下解决方案。
std::ifstream ifs("datacar.txt");
if(ifs)
{
std::string line;
while(std::getline(ifs,line))
{
/* optional to check number of items in a line*/
std::vector<std::string> row;
std::istringstream iss(line);
std::copy(
std::istream_iterator<std::string>(iss),
std::istream_iterator<std::string>(),
std::back_inserter(row)
);
/*To avoid parsing the first line and avoid any error in text file */
if(row.size()<=2)
continue;
std::string format = "%s %s %s %f %[^,] %d";
char year[line.size()],make[line.size()],three[line.size()],full[line.size()];
float numberf;
int numberi;
std::sscanf(line.c_str(),format.c_str(),&year,&make,&three,&numberf,&full,&numberi);
/* create your object and parse the next line*/
}
}