错误:从'int'到'const char *'的转换无效

时间:2013-01-10 09:09:43

标签: c++ printf

我有一个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?

3 个答案:

答案 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返回intsystem() expects const char*