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;
}
答案 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;
}
希望对您有帮助。