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