簡體   English   中英

C編程sprinf問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM