[英]C programming sprinf issue
我正在使用sprintf
打印int
變量,該變量應顯示1^2+2^2+3^2+4^2+5^2+6^2
。 但是我的代碼只輸出1^2+6^2
。 我不知道為什么中間部分不見了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* formatSeries(int n)
{
char *tagstr = (char *)malloc(sizeof(char)*n*n);
int pos = 0 ;
int k;
for (k = 1; k <= n; k++)
{
pos = sprintf(&tagstr[pos], "%d^2+", k);
}
tagstr[strlen(tagstr) - 1] = '\0';
return tagstr;
}
void main()
{
int n = 6;
printf("%s \n", formatSeries(n));
}
您的代碼中有兩個主要問題; 正如評論中已經提到的那樣,一個問題是您不增加pos
而是一次又一次(幾乎)使用相同的值進行重新分配。 因此,在第一次迭代之后,您將不斷地寫入4
的位置(如果k
變得> = 10且數字將因此獲得更多數字,則寫入5
),
其次,您的malloc
不適用於較小的k
,因為每個字符串"+1^2"
至少需要4個字符; 因此,如果使用n * n
調整緩沖區大小,則如果n
<= 3,則緩沖區將太小;如果n
變得較大,則(可能太大)會太大。
我建議假設最大范圍為n
(假設最多7位數字),並相應地確定緩沖區的尺寸。
一件小事(不是必需的)是,您可能完全避免編寫多余的+
,因為在第一次迭代中使用了不同的格式字符串。 只是顯示想法,真的不是必須的:
char* formatSeries(int n)
{
const size_t maxSize = n * (7+3) + 1;
char *tagstr = (char *)malloc(sizeof(char)*maxSize);
int pos = 0 ;
int k;
for (k = 1; k <= n; k++)
{
const char* formatStr = (k==1) ? "%d^2" : "+%d^2";
pos += sprintf(&tagstr[pos], formatStr, k);
}
return tagstr;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.