C/C++把字符串划分为二维字数组,2种分割方法

本实验是读取ini文件中的字符串,字符串是二维数组的形式。

方法一

首先我用的是strtok_s;
注:

1.strtok_s的用法
函数原型:char *strtok_s( char *strToken, const char *strDelimit, char **buf);
这个函数将剩余的字符串存储在buf变量中,而不是静态变量中,从而保证了安全性。
2.strtok的用法
函数原型:char * strtok (char str, const char delimiters);
参数:str,待分割的字符串(c-string);delimiters,分割符字符串。
3.区别:
strtok_s支持多线程,strtok只能是单线程

在ini里面的文件是:

[Matrix]
data = 0, 0.3, 0.35, 0.40, 0.45, 0.5, 0.55, 0.60@ 20, 0.378, 0.421, 0.46, 0.496, 0.529, 0.559, 0.585@ 30, 0.261, 0.294, 0.326, 0.357, 0.388, 0.419, 0.448@ 40, 0.183, 0.208, 0.232, 0.258, 0.285, 0.311, 0.339@ 45, 0.155, 0.177, 0.198, 0.22, 0.245, 0.272, 0.295@ 50, 0.135, 0.154, 0.172, 0.192, 0.214, 0.236, 0.261@ 60, 0.106, 0.121, 0.136, 0.152, 0.166, 0.189, 0.210@ 70, 0.086, 0.098, 0.111, 0.123, 0.316, 0.154, 0.172@ 80, 0.074, 0.085, 0.096, 0.106, 0.117, 0.133, 0.149@

在VS2013下运行代码是:

#include 
#include
#incldue

    char data[500];
    char ii1[15][100] = { 0 };
    double c[colum_data][row_data] = { 0 };//row_data、colum_data是自己定义的
    int icount = 0,jcount = 0;
    char *ptr1;
    char *ptr;


    ::GetPrivateProfileStringA("Matrix", "data", "", data, sizeof(data)-1, "ini的存放位置");
    ptr = strtok_s(data, "@", &p);     //strtok_s可生成动态链接库
    while (ptr != NULL)
    {
        strcpy_s(ii1[icount], ptr);
        // Division the data again
        ptr1 = strtok_s(ptr, ",", &p1);     
        while (ptr1 != NULL)
        {
            strcpy_s(ii1[jcount], ptr1);
            c[icount][jcount] = atof(ii1[jcount]);
            jcount++;
            ptr1 = strtok_s(NULL, ",", &p1);
            if (jcount == row_data) jcount = 0;
        }
        icount++;
        ptr = strtok_s(NULL, "@", &p);
    }

方法二

由于strtok_s无法在VC6.0上操作,VC6.0只支持strtok;而strtok只支持单线程。因此,我们得用另外的方法对其进行读取。

[Matrix]
data = 0, 0.3, 0.35, 0.40, 0.45, 0.5, 0.55, 0.60@ 20, 0.378, 0.421, 0.46, 0.496, 0.529, 0.559, 0.585@ 30, 0.261, 0.294, 0.326, 0.357, 0.388, 0.419, 0.448@ 40, 0.183, 0.208, 0.232, 0.258, 0.285, 0.311, 0.339@ 45, 0.155, 0.177, 0.198, 0.22, 0.245, 0.272, 0.295@ 50, 0.135, 0.154, 0.172, 0.192, 0.214, 0.236, 0.261@ 60, 0.106, 0.121, 0.136, 0.152, 0.166, 0.189, 0.210@ 70, 0.086, 0.098, 0.111, 0.123, 0.316, 0.154, 0.172@ 80, 0.074, 0.085, 0.096, 0.106, 0.117, 0.133, 0.149@

解决方法

#include 
#include
#incldue

    char data[500];
    char iii[15][100] = { 0 };
    double c[colum_M][row_M] = { 0 };
    int icount = 0,jcount = 0;
    char *ptr1;
    char delims[] = "@";


    //load the M_c from AGD.ini
    ::GetPrivateProfileStringA("Matrix", "data", "", data, sizeof(data)-1, "ini存放的目录");
    char* buf = data;
    char* result = NULL;
    while((result = strstr(buf,delims))!=NULL)
    {
        result_c[0] = '\0';
        ptr1 = strtok(buf, ",");
        while (ptr1 != NULL)
        {
            strcpy(iii[icount], ptr1);
            c[icount][jcount] = atof(iii[icount]);
            jcount++;
            ptr1 = strtok(NULL, ",");
            if (jcount == row_M) jcount = 0;
        }
        icount++;
        buf = result + strlen(delims);
    }

此种方法对解决VC6.0不能用strtok_s有很好的作用!因而在此记录。

转载请标注:http://blog.csdn.net/huang1024rui

你可能感兴趣的:(C++学习,c++,二维数组,读取字符串,分割字符串,存储)