1

を使用していくつかの文字列を印刷しようとしていますprintf()が、それらはヌル終了末尾に改行があり、それがフォーマットを台無しにします:

printf("The string \"%s\" was written onto the file \"%s\"", str, fname);

文字列に含まれ"The Racing car."、ファイル名が次のように表示されるとします"RandomText1.txt"

The string "The Racing car.
" was written onto the file "RandomText1.txt
"

ただし、1行だけで印刷したい:

The string "The Racing car." was written onto the file "RandomText1.txt"

文字列を変更して、ヌル ターミネータ改行ですが、可能であれば、文字列を変更せずにこの出力を実現する方法が欲しいです。

出来ますか?

4

4 に答える 4

8

これはヌル ターミネータとは関係ありません。文字列 はnull で終了する必要があります。

ここでは、末尾の改行 ( ) に関する問題に直面しています\n。文字列を に渡す前に、その改行を削除する必要がありますprintf()

最も簡単な方法 [の変更が必要str]: でこれを行うことができますstrcspn()。擬似コード:

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

可能であれば、文字列を変更せずにこの出力を実現します。

はい、可能です。その場合、長さ修飾子を使用して、出力printf()する配列の長さを制限する必要があります。たとえば、次のようになります。

printf("%15s", str);  //counting the ending `.` in str as shown

しかし、IMHO、これは最善の方法ではありません。文字列の長さを知って固定する必要があるためです。そうしないと、機能しません。

少し柔軟なケース、

printf("%.*s", n, str);

ここで、nを指定する必要があり、印刷する文字列の長さを保持する必要があります (改行なし)。

于 2015-05-15T13:43:06.437 に答える
6

すでに指摘したように、C のすべての文字列は null で終了する必要があります (そうでなければprintf、文字列がどこで終わるかをどうやって知ることができますか?)

おそらくstrchrを使用して、配列で改行を検索する必要があります。

これを試して:

  char* first_newline = strchr(str, '\n');
  if (first_newline)
      *first_newline = '\0';

改行の最初のインスタンスで文字列を終了します。

于 2015-05-15T13:46:45.677 に答える
1

Enterキーに対応する改行文字も文字列に含むstr標準関数fgets(または他の方法)を使用して配列内のデータを読み取ったようです。'\n'

このキャラクターを削除する必要があります。これは次の方法で行うことができます

size_t n = strlen( str );

if ( n && str[n-1] == '\n' ) str[n-1] = '\0';
于 2015-05-15T13:55:25.987 に答える
1

編集:これを見てください;)

文字列の特定の部分だけを印刷するには?

「strings lenths - 1」文字を出力するだけです

于 2015-05-15T13:42:16.337 に答える