sscanf直到它达到逗号

时间:2013-04-15 12:12:30

标签: c string scanf

我正在尝试扫描字符串中的单词和数字,如下所示:“ hello,world,I,287876,6.0 ”< - 此字符串存储在{{1}中数组(字符串) 我需要做的是将事情分开并将它们分配给不同的变量,这就像

char

我知道常规scanf在到达空白区域时会停止从标准输入读取。所以我一直在想,有可能让sscanf在达到“,”(逗号)时停止阅读

我一直在探索图书馆,找到sscanf的格式,只读字母和数字。我找不到这样的东西,也许我应该再看一次。

有任何帮助吗? 在此先感谢:)

4 个答案:

答案 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*/


        }

    }