一切似乎都很好。除非它不起作用。
这是这段代码所期望的:
Write a function that:
Receives: a string; (str)
a letter; (l)
an address of an integer (&j)
returns: an integer array; (*(i + k))
an integer value. (j)
数组的每个位置都应包含找到字母的位置。整数值应包含创建的数组的大小
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int *coincide(char *str, char l, int *j){
int *i, k, u, n = strlen(str);
for(k = u = 0; k < n; k++){
if(l == str[k]){
i = (int *) malloc(++u * sizeof(int));
i[u - 1] = k;
printf("i[%d - 1] = %d\n", u, i[u - 1]);
}
}
*j = u;
return i;
}
void main(){
char str[] = "testtest", l = 't';
int *i, j;
i = coincide(str, l, &j);
if(j > 0){
for(int k = 0; k < j; k++) printf("i[%d] = %d\n", k, i[k]);
puts("");
}
}
在linux上,结果是:
i[1 - 1] = 0
i[2 - 1] = 3
i[3 - 1] = 4
i[4 - 1] = 7
i[0] = 0
i[1] = 0
i[2] = 0
i[3] = 7
在Windows上,结果似乎是垃圾值而不是零。只有最后一个值是正确的。
那么,当函数等于i
时,数组元素到底发生了什么?
以及如何解决?
答案 0 :(得分:1)
由于@ M.M的洞察力,我使程序可以处理此更改:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int *coincide(char *str, char l, int *j){
int *i = NULL, k, u, n = strlen(str);
for(k = u = 0; k < n; k++){
if(l == str[k]){
i = (int *) realloc(i, ++u * sizeof(int));
i[u - 1] = k;
}
}
*j = u;
return i;
}
void main(){
char str[] = "testtest", l = 't';
int j, *i = coincide(str, l, &j);
if(j > 0) for(int k = 0; k < j; k++) printf("i[%d] = %d\n", k, i[k]);
if(j == 0) printf("\nThere's no ocorrence of '%c' character in '%s'\n", l, str);
}