0

私はCを初めて使用し、次のような可変長の文字列を作成しようとしています。

int main(int argc, char *argv[]) {
    if (argc > 1) {
        char filename[] = argv[1];
    }
    else {
        char filename[] = "temp.txt";
    }
    printf("%s", filename);
}

もちろん、文字列のスコープは条件文内にのみあるため、これは機能しません。

条件文に基づいて、この変数を長さが不明な文字列に割り当てるにはどうすればよいですか?

4

5 に答える 5

3

これは1つの方法です。

char* filename = "this is a different one";

if (boolean)
    filename = "this is a file name";

printf("%s", filename);
于 2012-09-27T15:52:20.007 に答える
2

char *単純なケースでは、例のように、外部スコープでaを宣言できます。

char *str = "a different file name";
if (boolean)
    str = "this file name";

しかし、もっと複雑なものは何でも、バッファを保持する必要があります。通常、ファイル名/パスの操作はより複雑です。たとえば、上記と同じことができargv[1]ますが、代わりに引数をコピーします。これは、プログラムの後半で変更する filename可能性があり、引数配列またはリテラル文字列に新しいポインタを割り当てるだけでよいためです。問題を引き起こします。

char filename[MAX_PATH + 1];

strncpy(filename, "temp.txt", MAX_PATH);
if (argc > 1)
    strncpy(filename, argv[1], MAX_PATH);

// .. later
strncat(filename, "temp.txt", MAX_PATH);

ただし、filename一度だけ設定する場合は、次のことも機能します。

char *filename = "temp.txt";

if (argc > 1)
    filename = argv[1];
于 2012-09-27T15:52:28.647 に答える
1

ファイル名変数はifステートメントの外で宣言する必要があります。そうしないと、ifステートメントの後に表示されません。ifステートメント内では、strcpyを使用して文字列を変数にコピーする必要があります。文字列を変更する必要がない場合は、char配列の代わりにcharポインタを使用できます。

于 2012-09-27T15:53:08.367 に答える
0
char filename[256];

if (boolean) {
    strcpy(filename,"this file name");
}
else {
    strcpy(filename, "a different file name");
}
printf("%s", filename);

または、を使用mallocしてメモリを割り当て、文字列をコピーすることもできます。

于 2012-09-27T15:53:39.290 に答える
0

条件文の前に文字列を定義します。次に、などの文字列コピー関数を使用して、必要なstrcpy値を文字列に配置します。例えば:

char filename[ MAX_PATH ];  
if (boolean) { 
    strcpy( filename, "this file name" ); 
} 
else { 
    strcpy( filename, "a different file name" ); 
} 
printf("%s", filename);
于 2012-09-27T15:57:07.677 に答える