如何正确分配字符串的结构数组

时间:2014-07-05 08:04:59

标签: c arrays string struct

/ 此消息的第一部分已解决,我在下面添加了一个编辑 /

我需要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) {

为什么你认为?

3 个答案:

答案 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