1

これがばかげた質問であるならば、申し訳ありませんが、私はかなり新しいです!

私はこれを持っています:

  fgets(question,200,stdin);
  char *memq = malloc(sizeof(strlen(question)));
  memq= question;

ただし、質問変数の末尾には常に新しい行があります。どうすればこれを削除/防止できますか?

私はこれを試しました:

  fgets(question,200,stdin);
  char *memq = malloc(sizeof(strlen(question))-sizeof(char));
  memq= question;

効果はありませんでした!

4

5 に答える 5

5

あなたのmallocの前に改行を取り除くには、次のようにします。

question[strlen(question)-1] = 0;

別の方法(以下のコメントで提案)は、代わりに次のことを行うことです。

question[strcspn(question, "\n")] = '\0';

malloc行を次のように変更します。

char *memq = malloc(strlen(question)+1);

割り当て行を変更します。

memq = question;

に:

strcpy (memq, question);
于 2010-12-14T17:45:55.843 に答える
2

このコードはひどく壊れています。

そこにデータをコピーする場合は、にstrlen+1バイトを割り当てる必要があります(なぜですか?それ以降は4バイトが割り当てられます)。 memqsizeofsizeof(strlen())sizeof(int)

単に割り当てquestionmemq、データがコピーされることを期待することはできません。これは、先ほど入力したポインタを上書きしてmallocリークmemqするだけです。あなたはしなければならない

strcpy(memq, question);

memqこれがヌルターミネータを含むため、に追加のバイトが必要なのはそのためです。この時点で、他の場所で説明memqされているように、改行を削除することができます。

于 2010-12-14T17:48:03.063 に答える
1

入力がABCDEnであるとしましょう。ここで、nは改行を表します。

ABCDEn0を読み取ることになります。ここで、0はnullを表し、文字列を終了します。

したがって、最後の文字を削除することで、改行ではなくnullを削除することになります。最後の文字をそのまま削除しますが、(新しい)最後の文字をnullに設定して、文字列を終了します。

于 2010-12-14T17:47:34.093 に答える
1

どちらの場合も、memq = question間違っています。新しく割り当てられたスペースへのポインタを失い、代わりにの最初の文字のアドレスをコピーしquestionましたmemq

strcpyまたはを使用して、が指す文字列の内容を、が指すメモリの内容memcpyコピーします。questionmemq

于 2010-12-14T17:48:26.313 に答える
0

ヒント:最後の文字を削除してください!(ヒント:あなたは長さを知っています)

于 2010-12-14T17:50:12.910 に答える