代码之家  ›  专栏  ›  技术社区  ›  keser

用snprintf()填充char数组

c
  •  -3
  • keser  · 技术社区  · 7 年前

    snprintf() 不合适。

        char staedte[MAX_LAENGE_ARR][MAX_LAENGE_STR];
        char laender[MAX_LAENGE_ARR][MAX_LAENGE_STR];
        int bewohner[MAX_LAENGE_ARR];
    
    
        char *p = (char*) malloc(len);
        if (p == NULL){
            perror("malloc failed while allocating an array of chars.");
            exit(1);
        }
    
        for (int i = 0; i < MAX_LAENGE_ARR; i++) {
            if(strcmp(bundesland,laender[i]) == 0 && bewohner[i] >= anzahl){
                snprintf(p,MAX_LAENGE_STR,"Die Stadt %s hat %d Einwohner. \n", staedte[i],bewohner[i]);
                snprintf(&p[i],MAX_LAENGE_STR,"Die Stadt %s hat %d Einwohner. \n", staedte[i],bewohner[i]);
            }
        }
        free(p);      
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Barmar    7 年前

    snprintf() 返回写入字符串的字节数。你可以用它来增加你写下一行的位置。

    int offset = 0;
    for (int i = 0; i < MAX_LAENGE_ARR; i++) {
        if(strcmp(bundesland,laender[i]) == 0 && bewohner[i] >= anzahl){
            int written = snprintf(p + offset, len - offset, Die Stadt %s hat %d Einwohner. \n", staedte[i], bewohner[i]);
            printf("%s : %d\n",staedte[i] , bewohner[i]);
            offset += written;
        }
    }
    

    我不知道你为什么打电话来 snprintf() 两次。我把刚才给你写信的那个拿走了 p .

    因为 p len 字节,指定最大写入量时应使用该值 ,不是 MAX_LANGE_STR . 你必须减法 offset 从它开始,因为每次写入都在字符串中更远,而且在它之后剩下的空间更少。

        2
  •  1
  •   user3629249    7 年前

    关于:

        if( strcmp( bundesland,laender[i] ) == 0 && bewohner[i] >= anzahl)
        {
                snprintf(p,MAX_LAENGE_STR,"Die Stadt %s hat %d Einwohner. \n", staedte[i],bewohner[i]);
                snprintf(&p[i],MAX_LAENGE_STR,"Die Stadt %s hat %d Einwohner. \n", staedte[i],bewohner[i]);
    
                printf("%s : %d\n",staedte[i] , bewohner[i]);
        }
    

    第一次打电话给 snprintf() 一直覆盖 p[] 数组

        char buffer[MAX_LAENGE_STR+1];
        p[0] = '\0';
    

    然后在循环中

        if( strcmp( bundesland,laender[i] ) == 0 && bewohner[i] >= anzahl)
        {
                snprintf( buffer, MAX_LAENGE_STR, "Die Stadt %s hat %d Einwohner. \n", staedte[i],bewohner[i]);
                strcat( p, buffer );
    
                printf("%s : %d\n",staedte[i] , bewohner[i]);
        }
    

    p[] 没有溢出。