繁体   English   中英

Int数组空 - C

[英]Int array empty - C

我正在尝试编写一个程序,它将采用两组字符串N和Q.该程序的目标是打印出Q中每个字符串出现在N中的次数。但是,我正在努力管理字符串和指针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;
} 

这里有一个问题

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. scanf("%s", N_array[N_i]);

    这应该导致SegFault ,因为N_array[N_i]不包含有效的内存地址。

    你需要的是使用malloccalloc分配内存,将N_array[N_i]指向一个有效的内存位置。

正确的代码是:

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等首先分配内存。

正确的代码可能是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM