C使用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] = ''; //<- needed for MCAT macro
test( buf );
printf( "buf: %snr", buf );
// also.. using pointer
char *txt = buf;
test( txt );
printf( "txt: %snr", txt );
// printf( "buf: %snr", buf ); // same output, ok
}

在";测试";函数,我经常看到strcpy带有一个临时局部变量,所以我想知道是否也可以使用sprintf来更改原始字符串";buf";。

一旦写入超过缓冲区大小(这里是100字节(,它就会变成未定义的行为,这是测试函数不检查也不能检查的,因为它不知道缓冲区大小。

感谢大家的回复。

暂时忽略了溢出因素,我想我见过的使用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] = ''; 
// "ptr +=" is added only for next usage  on case n.4
ptr += sprintf (buf + strlen(buf), "%s %d <- some data ...nr", "something", 1); 
printf( buf );
printf( "----------------------------------nr");
// or ... 
ptr += sprintf (&buf[strlen(buf)], "%s %d <- some data ...nr", "something", 2); 
printf( buf );
printf( "----------------------------------nr");
// or...
ptr += sprintf(strchr(buf, ''), "%s %d <- some data ...nr", "something", 3); 
printf( buf );
printf( "----------------------------------nr");
// or with pointers 
ptr += sprintf (ptr, "%s %d <- some data ...nr", "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-----------nr");
sprintf (tmp, "the output was:nr%s", tmp);
printf( tmp );
// But working on the other side?
printf( "---------------OK-----------------nr");
sprintf (buf, "the output was:nr%s",   fixcpy(buf) );
printf( buf );

// and probably work also...
printf( "---------------OK?----------------nr");
sprintf (buf, "the output was (new):nr%s%s",   fixcpy(buf),  fixcpy(buf) );
printf( buf );
// 
}
char *fixcpy( char *str )
{
static char buf[1000];
strcpy( buf, str );
return buf;
}

如果有人知道你正在处理的数据的大小,我觉得它看起来很整洁。

最新更新