【问题标题】:C - extract integer between two comma from stringC - 从字符串中提取两个逗号之间的整数
【发布时间】:2016-01-09 16:41:32
【问题描述】:

我有一个包含bicho,25,25-04-2000 的字符数组。 我想提取bicho 并将其放入变量中,2525-04-2000 也是如此。

我尝试了strtok()sscanf,但完全没有运气。

这是我使用的方法:

fp = fopen(fn,"r");
while(!feof(fp)){
  fgets(data, 255,fp);
  puts(data);
  pch = strtok (data,",");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, ",");
  }
}


我想将每个值存储在单独的变量中而不是打印它。

【问题讨论】:

  • 你尝试了什么?你的“尝试”在哪里?你的代码?
  • 请说出你是如何尝试但失败的
  • @rootkea 这是我的代码,fp = fopen(fn,"r");而(!feof(fp)){ fgets(数据,255,fp);放(数据); pch = strtok (数据,","); while (pch != NULL) { printf ("%s\n",pch); pch = strtok (NULL, ","); } }
  • @engineer 是的,我知道这种方法,但我想将每个方法存储在单独的变量中,以便以后使用。

标签: c split string-split


【解决方案1】:

您不必使用feof。您可以使用fgets 作为循环条件。然后只需将字符串存储在数组中即可。然后,您可以使用strtolatoi(如果需要)对您的号码进行数字转换。例如,您可以执行以下操作:

#define MAXL 10
#define MAXC 32

char array[MAXL][MAXC] = {{0}};
size_t index = 0;

if (!(fp = fopen (fn, "r"))) {
    fprintf (stderr, "error: file open faied '%s'.\n", fn);
    return 1;
}

while (fgets (data, 255,fp)) 
{
    char *p = data;
    if ((p = strtok (data, ","))) {
        size_t plen = strlen (p);
        if (plen + 1 < MAXC)
            strncpy (array[index++], p, plen + 1);
        else
            fprintf (stderr, "error: string exceeded MAXC\n");

        while (index < MAXL && (p = strtok (NULL, ",\n")) != NULL)
        {
            plen = strlen (p);
            if (plen + 1 < MAXC)
                strncpy (array[index++], p, plen + 1);
            else
                fprintf (stderr, "error: string exceeded MAXC\n");
        }
    }
}

使用 for 循环

您可以使用for 循环更有效地执行相同的操作:

while (fgets (data, 255,fp) 
{
    char *p = data;
    for (p = strtok (data, ","); index < MAXL && p; p = strtok (NULL, ",\n"))
    {
        size_t plen = strlen (p);
        if (plen + 1 < MAXC)
            strncpy (array[index++], p, plen + 1);
        else
            fprintf (stderr, "error: string exceeded MAXC\n");    
    }
}

注意:通过在复制到数组之前确认长度plen,您可以确保您的字符串是nul-terminated。如果您还有其他问题,请告诉我。

【讨论】:

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