1

私は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 に変換する場所はどこですか?

4

3 に答える 3

3

system は入力として const char * を想定していますが、sprintf は int を返します。これがエラーの原因となっている問題です。また、sprintf の最初の引数は、十分なサイズの書き込み可能なバッファーでなければなりません。

于 2013-01-10T09:12:53.383 に答える
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 を指定すると、コマンドに割り当てなければならないバッファの大きさがわかります。

このコードは、ユーザーが指定した任意のディレクトリでも動作し、バッファ オーバーランによる入力の切り捨てに悩まされることはありません。

気をつけて :)

編集:もちろん、システムは依然として悪であり、「実際の」コードでは決して使用しないでください;)

于 2013-01-10T09:46:37.587 に答える
1

sprintfドキュメントから

sprintf

int sprintf ( char * str, const char * format, ... );

sprintf()は、フォーマットされたデータを文字列に書き込みます。

printfでformatが使用された場合に印刷されるのと同じテキストで文字列を作成しますが、コンテンツは印刷される代わりに、strが指すバッファーにC文字列として格納されます

str-結果のC文字列が格納されるバッファへのポインタ 。バッファは、結果の文字列を含むのに十分な大きさである必要があります。

sprintf最初の引数に書き込みます。あなたの場合、最初の引数は文字列リテラルです。

また、他の回答が指摘しているように、sprintfは戻ってきintsystem() 期待しています const char*

于 2013-01-10T09:17:03.347 に答える