Int数组空 - C

时间:2016-01-08 19:42:30

标签: c arrays string strcmp strcpy

我正在尝试编写一个程序,它将采用两组字符串N和Q.该程序的目标是打印出Q中每个字符串出现的次数。但是,我正在努力管理字符串C中的指针,特别是我认为我的问题源于尝试拥有一个字符串数组。执行下面的代码时,我遇到了分段错误。我已经注释了我使用printf()进行调试的尝试。我相信当我尝试将S分配到N_array时会出现问题。

int main() {
    int N, Q; 
    char *N_array[1000], *Q_array[1000];

    scanf("%d", &N);

    for (int N_i = 0; N_i < N; N_i++) {
        //printf("made it through A for loop %d times\n", N_i+1);
        scanf("%s", N_array[N_i]);
    }

    scanf("%d", &Q);

    //Does the array contain any information?
    //for (int N_i = 0; N_i < N; N_i++) { printf("N_array[%d] == %d\n", N_i, N_array[N_i]);}

    for (int Q_i = 0; Q_i < Q; Q_i++) {
        //printf("Made it to B for loop\n");
        int occurs = 0, result;
        char s[21];
        scanf("%s", &s[21]);
        strcpy(Q_array[Q_i], s);
        for (int N_i2 = 0; N_i2 < N; N_i2++) {
            //printf("Made it to C for loop\n");
            result = strcmp(Q_array[Q_i], N_array[N_i2]);
            if (result == 0) occurs++;
        }
        printf("%d", occurs);
    }

    return 0;
} 

2 个答案:

答案 0 :(得分:6)

这里有一个问题

for (int N_i = 0; N_i < N; N_i++) {
    //printf("made it through A for loop %d times\n", N_i+1);
    scanf("%s", N_array[N_i]);
}

N_Array包含1000个指向char的指针,但是这些指针中的每一个指向,嗯......无处。它是一个未初始化的指针,指向您不拥有的随机存储位置。这是未定义的行为。您必须在scanf之前分配内存。

 N_Array[N_i] = malloc(max_length_of_string + 1);

另一个问题是这一行

 char s[21];
 scanf("%s", &s[21]);

scanf的第二个参数应该只是s,而不是&s[21],它就在数组之外。

你下面的一行有与我的第一点

中描述的问题相同的问题
strcpy(Q_array[Q_i], s);

Q_array[Q_i]尚未指向您允许写入的任何内存。你也应该在这里分配内存。

答案 1 :(得分:3)

  1. scanf("%s", N_array[N_i]);

    由于SegFault不包含有效的内存地址,因此应该导致N_array[N_i]

    您需要的是使用malloccalloc分配内存以将N_array[N_i]指向有效的内存位置。

  2. 正确的代码是:

    for (int N_i = 0; N_i < N; N_i++)
    {
        if(!(N_array[N_i] = malloc((MAX_STRING_LENGTH + 1) * sizeof(char))))
        {
            printf("malloc failed!\n);
            exit(1);
        } 
        scanf("%s", N_array[N_i]);
    }
    
    1. scanf("%s", &s[21]);

      这是不正确的,因为%s期望char *,但&s[21]的类型为char **

      您需要使用scanf("%20s", s);代替。

      这种方式scanf最多只能读取20个字符(因为我们有char s[21]。所以保留\0字符的最后一个字节),这样可以避免意外的缓冲区溢出(用户输入的字符串长度大于20)。

      1. strcpy(Q_array[Q_i], s);

        此处Q_array[Q_i]再次指向无效的内存地址,因为它包含垃圾值。使用malloccalloc等先分配内存。

      2. 正确的代码可能是:

        if(!(Q_array[Q_i] = malloc((MAX_STRING_LENGTH + 1) * sizeof(char))))
        {
            printf("malloc failed!\n);
            exit(1);
        }
        strcpy(Q_array[Q_i], s);