用snprintf()填充char数组

时间:2018-10-25 16:11:00

标签: c

我正在尝试在条件下用值填充char数组。问题是我不能正确使用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 个答案:

答案 0 :(得分:1)

关于:

    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[]没有溢出的检查。

答案 1 :(得分:0)

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个字节,因此在指定要在snprintf()中而不是MAX_LANGE_STR中写入的最大数量时,应使用该长度。您必须从中减去offset,因为每次写入都在字符串中更远的地方,并且在其后留有更少的空间。

相关问题