/ 此消息的第一部分已解决,我在下面添加了一个编辑 /
我需要malloc一个字符串数组及其相对字符串。我搜索了一下,但问题有点不同。 我需要做的是询问用户一个值,然后检查该值是否存在于数组的先前位置。为此,我以这种方式使用二进制搜索:
BinarySearch(stringa** array, char* value, 0, i)
其中i是迭代索引。
我在二进制搜索中的strcmp()中遇到了段错误。通过一些调试,我明白问题不是在二进制搜索中,而是在我malloc字符串数组的方式。这是我出于调试原因使用的简单代码。
struct的定义:
typedef struct _stringa {
char* string;
int freq;
} stringa;
然后在主要内部:
scanf("%d", &n); // Number of strings
stringa** array;
array = (stringa**)malloc(n*sizeof(char*));
for (i=0; i<n; i++) {
char* value = (char*) malloc(101* sizeof(char));
scanf("%s", value);
array[i]->string = (char*)malloc(101 * sizeof(char) );
array[i]->string = value;
array[i]->freq = 1;
}
我得到了我的段错误:
array[i]->string = (char*)malloc(101 * sizeof(char) );
所以我的猜测是,它并不认为在array [i] - &gt;字符串中应该有一个字符串。 我怎样才能解决这个问题? 对不起,我正处于编程的开始
提前谢谢!
修改: 我现在按照注释中的建议修复了字符串数组,但是我在二进制搜索中得到了类似的段错误: int BinarySearch(stringa * array,char * string,int left,int right){
int middle;
if (left==right) {
if (strcmp(string,array[left].string)==0) {
return left;
} else {
return -1;
}
}
middle = (left+right)/2;
if ((strcmp(string,array[middle].string)<0) || (strcmp(string,array[middle].string)==0) ) {
return BinarySearch(array, string, left, middle);
} else {
return BinarySearch(array, string, middle+1, right);
}
}
问题在于:
if ((strcmp(string,array[middle].string)<0) || (strcmp(string,array[middle].string)==0) ) {
或在这里:
if (left==right) {
if (strcmp(string,array[left].string)==0) {
为什么你认为?
答案 0 :(得分:3)
array
应该是stringa
的数组,而不是指针数组。
scanf("%d", &n); // Number of strings
stringa* array;
array = malloc(n*sizeof(stringa));
for (i=0; i<n; i++) {
char* value = malloc(101* sizeof(char));
scanf("%s", value);
array[i].string = value;
array[i].freq = 1;
}
但如果你真的想要一个指向stringa
的指针数组,那么代码就是:
stringa** array;
array = malloc(n * sizeof(stringa*)); // Allocate array of pointers
for (i = 0; i < n; i++) {
stringa[i] = malloc(sizeof(stringa)); // Allocate this struct
char* value = malloc(101* sizeof(char)); // Allocate the string
scanf("%s", value);
array[i]->string = value;
array[i]->freq = 1;
}
答案 1 :(得分:1)
您没有正确处理stringa
。只要您在char*
内附加stringa
,就只需要stringa *
来表示字符串数组。
stringa* array = malloc(n*sizeof(stringa));
for (i=0; i<n; i++) {
char value[101];
scanf("%s", value);
array[i].string = malloc(101 * sizeof(char));
strcpy(array[i].string, value);
array[i].freq = 1;
}
答案 2 :(得分:0)
您的代码中有一些错误。以下是评论示例:
int main (void)
{
char value[101];
int n = 0;
char strip;
printf ("Enter the number of structures to create: ");
scanf("%d", &n); // Number of strings
strip = getchar(); while (strip != '\n') strip = getchar(); // flush stdin
stringa **array = NULL;
array = malloc ( n * sizeof (struct _stringa *) );
int i = 0;
for (i=0; i<n; i++) {
array[i] = malloc (sizeof (struct _stringa));
array[i]->string = malloc (sizeof (value)); // example only (strdup allocates)
printf ("Enter the text of array[%d]->string : ", i);
scanf("%s", value);
strip = getchar(); while (strip != '\n') strip = getchar(); // flush stdin
array[i]->string = strdup(value); // dup content of value
array[i]->freq = 501; // dummy value
printf (" array[%d]->string: %s array[%d]->freq: %d\n",
i, array[i]->string, i, array[i]->freq);
}
while (--n >= 0) {
if (array[n]->string) free (array[n]->string);
if (array[n]) free (array[n]);
}
if (array) free (array);
return 0;
}
输出:
Enter the number of structures to create: 4
Enter the text of array[0]->string : my
array[0]->string: my array[0]->freq: 501
Enter the text of array[1]->string : dog
array[1]->string: dog array[1]->freq: 501
Enter the text of array[2]->string : has
array[2]->string: has array[2]->freq: 501
Enter the text of array[3]->string : fleas
array[3]->string: fleas array[3]->freq: 501