使用strtok()分解字符串并将其放入数组

时间:2014-11-15 10:55:03

标签: c arrays csv

我正在编写一个基本程序,它接受一个CSV文件,打印第一个字段,并对其他字段进行一些数值评估。

我希望将所有数字字段放入​​数组中,但每次执行此操作并尝试访问数组的随机元素时,它会打印整个数据

我的CSV文件是:

Exp1,10,12,13
Exp2,15,16,19

我试图访问第二个字段,然后打印

Exp1 12
Exp2 16

但我得到了

Exp1 101213
Exp2 151619

如果有人可以提供一些建议。这是我的代码:

#define DELIM ","

int main(int argc, char *argv[])
{
     if(argc == 2) {
         FILE *txt_file;
         txt_file = fopen(argv[1], "rt");

         if(!txt_file) {
             printf("File does not exist.\n");
             return 1;
         }

         char tmp[4096];
         char data[4096];
         char expName[100];
         char *tok;
         int i;

         while(1){
             if(!fgets(tmp, sizeof(tmp), txt_file)) break;

             //prints the experiment name
             tok = strtok(tmp, DELIM);
             strncpy(expName, tok, sizeof(expName));
             printf("\n%s ", expName);

             while(tok != NULL) {
                 tok = strtok(NULL, DELIM);

                //puts data fields into an array
                for(i=0; i < sizeof(data); i++) {
                     if(tok != NULL) {
                          data[i] = atoi(tok);
                     }
                }
                printf("%d", data[1]);
             }
        }
 fclose(txt_file);
 return 0;
 }

2 个答案:

答案 0 :(得分:0)

要修复的示例

 char tmp[4096];
 int data[2048];
 char expName[100];
 char *tok;
 int i=0;

 while(fgets(tmp, sizeof(tmp), txt_file)){
     tok = strtok(tmp, DELIM);
     strncpy(expName, tok, sizeof(expName));
     printf("\n%s ", expName);

     while((tok = strtok(NULL, DELIM))!=NULL){
         data[i++] = atoi(tok);
    }
    printf("%d", data[1]);
    i = 0;
}

答案 1 :(得分:0)

修改后的代码段:

     int data[20]; // change 20 to a reasonable value
...
     while (1)
     {   if (!fgets(tmp, sizeof(tmp), txt_file))
             break;

         //prints the experiment name
         tok = strtok(tmp, DELIM);
         strncpy(expName, tok, sizeof(expName));
         printf("\n%s ", expName);

         i = 0;
         tok = strtok(NULL, DELIM);
         while (tok != NULL)
         {  //puts data fields into an array
            data[i++] = atoi(tok);
            if (i == 20)
                break;
            tok = strtok(NULL, DELIM);
         }
         if (i > 1)
            printf("%d", data[1]);
     }