为什么我的条件陈述中的指针算术指针失败了?

时间:2018-11-09 04:35:47

标签: c pointer-arithmetic double-pointer

sm是动态分配的2D字符指针数组。我需要了解为什么我的指针算术指针在循环结构中有条件时失败。

sm中的第二列是字符串,我需要使用成绩键gk(即字符/字符串数组)进行测试。 s保留行大小,q是2D数组的列大小,hm是我的堆内存计数器,用于释放函数,该函数不针对我的问题导入。

double *cals(char **sm, char *gk, int s, int q, unsigned *hm) {
    int c = 0;
    double *savg = malloc(s * sizeof(double));
    assert(savg);
    *hm += 1;

    for (int i = 0; i < s; *(savg + i) = c / q * 100 , c = 0,  ++i) {
        for (int j = 0; j < q; ++j) {
            if (*(*(sm + i * STUDENTATT + 1) + j) == *(gk + j)) 
                ++c;
        }
    }
    return savg;
}

1 个答案:

答案 0 :(得分:0)

关于cals函数的用途的信息很少,因此我不得不作一些假设以编写此答案。

假设1(有意义):- 您要查找两个字符串中相等的字符(没有每个字符),然后查找相同字符占总字符的百分比。如果是这种情况,请使用以下代码。

double *cals(char **sm, char *gk, int s, int q, unsigned *hm) {
    float c = 0;        // To force float division the c is declared as a float variable
    double *savg = malloc(s * sizeof(double));
    assert(savg);
    *hm += 1;       
    char* sm_i_key = NULL;
    unsigned int strlen_gk = strlen(gk);    
    unsigned int key_length = string_gk;

    for (int i=0; i<s; ++i) { //The calculation is moved inside for loop
            sm_i_key = *(sm+i*q+1); // You can also use sm_i_key = &sm[i*q+1]
            /* Uncomment this section if length of 2 strings are not bound to be equal
            if(strlen(sm_i_key) < strlen_gk){
                    key_length = sm_i_key; 
            }
            else{
                    key_length = strlen_gk
            }
            */
            for (int j = 0; j < key_length; ++j) {
                    if (sm_i_key[j] == gk[j]) 
                        ++c;
            }
            savg [i] = c / strlen_gk * 100; /* Since gk is the grade key it is assumed
            to be equal to the total number.*/
            c = 0;
        }          
    return savg;
}

假设2 :- 您要检查其起始地址存储在2D数组sm的每一行的第二列中的字符串是否等于gk所指向的数组中存储的字符串,然后计算一个值(double )。 函数cals仅返回0.0或100.0,因为公式avgs[i]=c / q * 100仅在字符串不相等时才会产生0(因为整数除法c / q在c小于q时始终为0,这是大小写),如果字符串相等则为100(然后,如果只存储0和100,为什么要使用double来存储值)。

如果是这种情况,那么除非数组gk和数组sm[i][2]具有不同的字符串长度(而不是q),否则您在这里所做的工作就很好。如果两个数组的字符串长度不同,最好使用strncmp来检查字符串是否相等。 使用以下代码执行此操作:-

double *cals(char **sm, char *gk, int s, int q, unsigned *hm) {
    int c;
    char* sm_i_key = NULL;
    double *savg = malloc(s * sizeof(double));
    assert(savg);
    *hm += 1;       
    for (int i=0; i < s;++i){//The calculation is moved to a static assignment given below
        if(strncmp(sm_i_key, gk, strlen(gk) == 0)
        {
            savg[i] = 100.0;    // Since c/q * 100 => 100.0 if q == c
        }
        else
        {
            savg[i] = 0.0;      /*Since c/q *100 => 0.0 if q < c since integer 
            division will result in 0.*/
        }
    }              
    return savg;
}

希望对您有帮助。