我有一个C ++程序:
#include <iostream>
using namespace std;
int main (){
char x [10] = "abc";
system (sprintf ("mkdir ", "%s", x)); //error happens here, can't
//convert int to const char*
return 0;
}
结果:
sys.c:8:37: error: invalid conversion from ‘int’ to ‘const char*’
我在哪里将int转换为char?
答案 0 :(得分:3)
系统需要一个const char *作为输入,而sprintf返回一个int。这是引发错误的问题。此外,sprintf的第一个参数必须是足够大小的可写缓冲区。
答案 1 :(得分:3)
我知道这个问题已经得到了解答,但我想分享另一种解决方法,而且评论过于冗长:)
简短的例子:
#include <cstdio>
#include <cstdlib>
int main()
{
char x[] = "yourdirectory";
/* len will contain the length of the string that would have been printed by snprintf */
int len = snprintf(0, 0, "mkdir %s", x);
/* casting the result of calloc to (char*) because we are in C++ */
char *buf = (char*)calloc(len + 1, sizeof(char));
/* fail if the allocation failed */
if(!buf)
return -1;
/* copy to buffer */
snprintf(buf, len + 1, "mkdir %s", x);
/* system is evil :( */
system(buf);
return 0;
}
因为snprintf返回了已经打印的字符数,所以给它一个长度为0会告诉你必须为命令分配多大的缓冲区。
此代码也适用于用户提供的任意目录,并且不会受到缓冲区溢出的输入截断的影响。
小心:)
编辑:当然,系统仍然是邪恶的,不应该在“真正的”代码中使用;)答案 2 :(得分:1)
来自sprintf文档
的sprintf
int sprintf ( char * str, const char * format, ... );
sprintf()将格式化数据写入字符串。
使用与格式相同的文本组成一个字符串 用于printf,但不是打印,内容是 在str 指向的缓冲区中以C字符串形式存储。
str - 指向存储结果C字符串的缓冲区的指针。缓冲区应足够大,以包含生成的字符串。
sprintf
写入第一个参数,在您的情况下,第一个参数是string literal。
另外,正如其他答案所指出的,sprintf返回int
和system()
expects const char*