我有一个名为buf的C数组。这是它的定义:
char buf[1024];
现在,我当前的代码来自stdin
并使用fgets()
来设置该数组,但我希望使用代码来设置它。现在设置buf的行看起来像这样:
fgets(buf, 1024, stdin);
基本上,我想替换stdin,比如说......“My String”。最好的方法是什么?
答案 0 :(得分:8)
查找sprintf
,例如:Cpp reference
编辑:
sprintf(buf, "My string with args %d", (long) my_double_variable);
编辑2:
建议避免溢出(但这是标准C),您可以使用snprintf。
答案 1 :(得分:4)
snprintf只是C99而不是C89,sprintf_s / strcpy_s只是MSVC,而不是C89,而不是C99。
char *mystr="come from stdin or file or ...";
char buf[1024];
...
memset(buf,0,sizeof buf);
strncpy(buf,mystr,(sizeof buf)-1);
或非数组:
#define BUFLEN 512
char *mystr="come from stdin or file or ...";
char *buf;
...
char *buf=calloc(1,BUFLEN);
strncpy(buf,mystr,BUFLEN-1);
它适用于所有ANSI C环境。
答案 2 :(得分:2)
strcpy(buf, "My String");
Microsoft的编译器还包含一个strcpy_s函数,它是strcpy的“安全”版本。它确保您不会超出buf
。在这种特殊情况下,这可能不是问题,但你应该知道。但是,请注意,它不适用于任何其他编译器,因此它可以在需要便携式的地方使用。
strcpy_s(buf, sizeof(buf), "My String");
答案 3 :(得分:1)
有许多变体,有些已经提出过,有些则没有:
...
char input[] = "My String";
strcpy(buf, input);
strncpy(buf, input, sizeof(buf));
sscanf(input, "%s", buf);
sprintf(buf, "%s", input);
memcpy(buf, input, strlen(input));
...
他们中的大多数都不确定/不安全。究竟应该采取什么取决于 您真正希望在您的代码中执行的操作。
此致
RBO
答案 4 :(得分:-1)
详细但安全:
int copy_size = sizeof( buf ) - 1 < strlen( MyString ) ? sizeof( buf ) - 1 : strlen( MyString );
memset( buf, 0, copy_size + 1 );
memcpy( buf, MyString, copy_size );