質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1013閲覧

特殊文字\rは環境依存で結果が変わるのか

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1グッド

0クリップ

投稿2022/10/10 17:34

C言語の特殊文字の学習で例題サンプルコードの実行結果と同じになりません。
\nを書いたらサンプルの実行結果となったがなぜそうなるのかが知りたい。
環境よってそうなってしまうものなのかが知りたいです。

発生している問題

printf("123\r45");の実行結果が453と出力されるはずが45になってしまう。

該当のソースコード

C言語
#include <stdio.h>
int main(void)
{
printf("123\r45");

return 0;

}

試したこと

\nが書かれていなかったため気になりprintf("123\r45\n")としたところ例題の実行結果と同じく453と出力されました。

paizaラーニングの環境で実行すると
123
45
となってよくわからなくなりました。

分かるという方がおられましたらよろしくお願いします。

補足情報(FW/ツールのバージョンなど)

windows11 visual studio 2022

melian😄を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2022/10/10 18:45

paiza ラーニングなので paiza.io と実行環境が同じなのではないと思います。以下の質問・回答が参考になるかと思います。 エスケープシーケンス"\r"が動作しない。 https://teratail.com/questions/290623
guest

回答4

0

ベストアンサー

コンパイラは、'\n'に対してコンパイラが信じる(大抵は対応OSが改行コードとする)文字コードを出力します。
・MS-DOS/Windowsの流れはCR+LF (0x0d, 0x0aの2文字)
・旧Mac(OS9以前)はCR(0x0d)
・unix, Linux系はLF(0x0a)
・(unix系という意味ではなく)無条件にLFの文字コードとして0x0aを出力する(組込みでありがち)
ここでCRとかLFというのは、元々の意味としてはタイプライターの世界でCR=Cardige Return 行頭に戻る、LF=Line Feed '紙'を次行に送る(次文字の桁位置は変わらない) 。

タイプライターの動作をエミュレートして、次行に送り、つづいて行頭に戻ることでいわゆる改行動作をする、というのがMS-DOSタイプの考えでしょう(1文字に対して2バイト出力が微妙に嫌われるケースがあるというのはまた別の話として)。
タイプライターに縛られず、そんなの1バイトで改行表せばいいじゃない、というのでCRを選択したのが旧Mac、LFを選択したのがunix系、ということと想像します(なんの根拠も持っていないので)。
なお、'\r'はコンパイラに依らずCRのコード(0x0d)を吐くのが普通だと思います。意識して調べたことはありませんが。

一方、「端末」は、文字コードを受けた時どう動作すべきでしょうね。考え方で分かれるでしょう。
忠実にタイプライターのエミューレータとしてCRで行頭、LFで次行...MS-DOS系ならこれでOK。でも、この動作で旧Macやunixの端末としてテキストを流し込まれたら「改行」に見えません。当然端末としてそれぞれに対応する(CRあるいはLFだけで'改行'する)ものに分化するでしょう。汎用の端末であれば切り替えの設定がどこかにあるかも知れません。なにかのシステムに組み込まれた端末であれば、どのように動作するかは決め打ちでいいはずです。

そうなると、どう表示されるかはわかるとかわからないとかではなく「端末がそのように作られている」という話しかできないでしょう。同じ母体だからといってpaiza.ioとpaizaラーニングの端末が同じであるという保証もないし、
・改行コードには流派がある
・それを受け取る端末の動作にも流派がある
・改行コード周りをいじくり回すとそのへんの混乱が見えてしまう
ということで、そういうものだ、と受け入れるしかないのでは?
この時代に「俺は端末表示のウイザードを目指すぜ!」 とかいうのならまぁ頑張って「わかって」もいいですけれど。(MS-DOSの終末期にはCUI画面でいかにGUIっぽいことをするかというのに努力が注がれた時代がありましたっけ)

(MS-DOS系でもscanfの"%c"で改行が一文字でとれるぢゃないか、とかいうのはまたちょっとべつの話として...)

投稿2022/10/10 23:24

thkana

総合スコア7667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/10/11 06:00

回答ありがとうございます。 環境によって動作が変わるということはprintf("123\r45");の結果が45でも間違っているわけではないということで受け入れます。 解説ありがとうございました。
guest

0

unix系の端末なら、CR(¥r)に対してどう振る舞うかsttyコマンドで設定できたりします。
https://linuxjm.osdn.jp/html/GNU_coreutils/man1/stty.1.html

投稿2022/10/10 19:48

編集2022/10/10 23:26
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

極論としてはあらゆる規格も守るかどうかは作者次第ですので、『環境依存では無い』と決まっていたとしても、違う環境で違う結果が出たとすれば『環境依存になって(しまって)いる』という他は無いのでは無いでしょうか。

投稿2022/10/10 17:53

jimbe

総合スコア12848

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

結果が変わる、のではなく、動作が変わるってことです。
\r は改行の動作をする環境があれば、CR(キャリッジリターン)の動作をする環境もあります

改行:次の行の先頭にカーソルを移動
CR:現在の行の先頭にカーソルを移動

ってことで、結果が変わる、ようにみえてるだけです

投稿2022/10/10 23:05

編集2022/10/10 23:07
y_waiwai

総合スコア87834

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問