0

char * で特定の行を取得する必要がありますが、配列に何か問題があります...どうすればそれを行うことができますか?

関数は次のようなものです。

char * line get_line(char * code, int num_line);

frees と mallocs はどこに置くべきですか?

ありがとう!

申し訳ありません...もっと明確にする必要がありました。これが私が解決した方法です(スペイン語です)

char* obtenerLinea(char*cont, int numLinea)
{
    int32_t lineaActual=0,comienzoLinea=0,caracterActual=0;        // línea
    char *cadena;

    while(lineaActual<numLinea)
    {
        comienzoLinea=caracterActual;
        while(contenido[caracterActual]!='\n')
            {caracterActual++;}
        caracterActual++;
        lineaActual++;
    }
    cadena = sub_string(contenido, comienzoLinea, caracterActual-comienzoLinea);

    return cadena;
}
4

2 に答える 2

1

私の短い答えは次のとおりです。malloc関数の内側とfree外側に配置します。

でも、あなたの質問の仕方は、「お茶会を開きたいのですが、テーブルと椅子はどこに置けばいいですか?」と言っているようなものです。

私が言いたいのは、あなたの質問は解釈の余地があるということです:

  1. 入力文字列を変更したくありませ(作成しないことで許可されていると言っていましたがconst)。
  2. 入力文字列を変更し、それにポインターを返したいとします
  3. 入力文字列を変更するかどうかは問題ではありません。入力文字列から文字列をコピーする必要があります。

malloc上記のケース 1 と 3 では、関数内または関数内のいずれかを呼び出すことになりstrdupます。の場合malloc、文字列データを新しいメモリにコピーします。strdup入力文字列を変更して、行をヌルで終了する必要があるためです。このような場合、新しく割り当てられたポインターを返します。これは、呼び出し元が使い終わったときに解放する責任があります。strndupバッファを変更せずに使用する可能性もあることに注意してください。

番号 2 の場合、バッファを変更してその一部へのポインタを返すだけなので、 mallocorの呼び出しはありません。free

mallocいずれの場合も、呼び出し先とfree入力バッファー自体については既に知っているものと想定しています。

于 2012-11-21T03:21:11.360 に答える
0

あなたが何を求めているのか、100% 明確ではありませんが、これはあなたが探している機能の種類ですか?

char *get_line(char *code,int line) {
    size_t size = strlen(code);

    size_t current_line = 0;
    for(size_t n=0;n<size;n++) {
        if(current_line == line) return code+n;
        if(code[n] == '\n') current_line++;
    }

    return 0;
}


char *data = "line1\nline2\nline3\nline4";

char *line = get_line(data,2);
于 2012-11-21T03:03:38.417 に答える