我正在尝试在条件下用值填充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);
}
答案 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
,因为每次写入都在字符串中更远的地方,并且在其后留有更少的空间。