簡體   English   中英

C 使用 sprintf 修改字符串

[英]C modify string using sprintf

以下步驟都是合法的還是可能存在一些未定義的行為?

#include <stdio.h>
#include <string.h>
#define MCAT(a) ((a)+strlen(a))

void test(char *ptr)
{
  static int i = 0;
  int n = 0;
  while ( n++ < 10 )
  sprintf( MCAT(ptr), " %d ", ++i );
  return;
}
int main()
{
   char buf[100];
   buf[0] = '\0'; //<- needed for MCAT macro
   test( buf );
   printf( "buf: %s\n\r", buf );

// also.. using pointer
   char *txt = buf;
   test( txt );
   printf( "txt: %s\n\r", txt );
// printf( "buf: %s\n\r", buf ); // same output, ok

}

在“測試”function中,我經常看到strcpy帶有一個臨時的局部變量,所以我想知道你是否也可以使用sprintf來更改原始字符串“buf”。

一旦您寫入超出緩沖區大小(此處為 100 字節),它就會變成未定義的行為,這是您的測試 function 不會檢查也無法檢查的東西,因為它不知道緩沖區大小。

感謝大家的回復。

暫時忽略溢出因素,我在想我見過的使用 sprintf 連接字符串的最常見策略是:

#include <string.h>
#include <stdio.h>
char * fixcpy(char *str); 

int main(int argc, char *argv[])
{
char buf[1000]; 
char *ptr = buf; 
buf[0] = '\0'; 

// "ptr +=" is added only for next usage  on case n.4

ptr += sprintf (buf + strlen(buf), "%s %d <- some data ...\n\r", "something", 1); 
printf( buf );

printf( "----------------------------------\n\r");

// or ... 
ptr += sprintf (&buf[strlen(buf)], "%s %d <- some data ...\n\r", "something", 2); 
printf( buf );

printf( "----------------------------------\n\r");

// or...
ptr += sprintf(strchr(buf, '\0'), "%s %d <- some data ...\n\r", "something", 3); 
printf( buf );

printf( "----------------------------------\n\r");

// or with pointers 
ptr += sprintf (ptr, "%s %d <- some data ...\n\r", "something", 4);
printf( buf );


// But if you want the output as argument of input you can't do that:
char tmp[1000];
strcpy( tmp, buf ); // because I want save the source  buf
printf( "---------ASPECTED ERROR-----------\n\r");
sprintf (tmp, "the output was:\n\r%s", tmp);
printf( tmp );

// But working on the other side?
printf( "---------------OK-----------------\n\r");
 sprintf (buf, "the output was:\n\r%s",   fixcpy(buf) );
 printf( buf );
 
// and probably work also...
 printf( "---------------OK?----------------\n\r");
 sprintf (buf, "the output was (new):\n\r%s%s",   fixcpy(buf),  fixcpy(buf) );
 printf( buf );

// 
}

char *fixcpy( char *str )
{
    static char buf[1000];
    strcpy( buf, str );
    return buf;
}

如果有人知道您正在處理的數據的大小,它對我來說看起來很整潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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