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

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

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

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

Q&A

1回答

1302閲覧

C言語の拡張表記が表示されない

Maruki

総合スコア0

C

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

0グッド

0クリップ

投稿2021/07/26 00:15

前提・実現したいこと

現在『新・明解C言語中級編』こちらの書籍でC言語の学習をしています。
書籍で扱う以下の拡張表記をeclipseで表現したいです。
・\b 後退
・\r 復帰
・\a 警報

書籍では、printfの中に書くと、使える想定となっています。
たとえば、\bの場合は以下の通りです。
イメージ説明

発生している問題・エラーメッセージ

しかし、実行した結果は以下の通りでした。
文字を消す代わりに、スペースが出来てしまいます。

ABCDEFG       

該当のソースコード

C言語

1 2#include <time.h> 3#include <stdio.h> 4 5int sleep(unsigned long x) 6{ 7 clock_t c1 = clock(), c2; 8 9 do { 10 if ((c2 = clock()) == (clock_t)-1) /* エラー */ 11 return 0; 12 } while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x); 13 return 1; 14} 15 16int main(void) 17{ 18 int i; 19 printf("ABCDEFG"); 20 21 for(i=0; i<7; i++){ 22 sleep(1000); 23 printf("\b \b"); 24 fflush(stdout); 25 } 26 return 0; 27} 28

試したこと

書籍のコードをそのまま書いただけなのに
その通り動かないのは環境要因なのかと思い、
検索してみましたが、有用な情報が見つかりませんでした。
どなたか分かる方に解決方法をご教示願います。

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

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

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

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

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

Zuishin

2021/07/26 00:22

環境要因です。 \b はバックスペース文字という文字にすぎず、それで後退するかどうかはターミナルに依存します。 書籍を最初から読んで環境を書籍に合わせてください。 環境について触れられていないのであれば、その書籍のその部分の周辺に解説があると思いますが、ないのであれば本を変えましょう。
y_waiwai

2021/07/26 00:24

動かないとはどうなるんでしょうか。ちと意味不明です。 エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、いらぬ翻訳省略しないで、出たそのママをコピペで提示してください
episteme

2021/07/26 00:49

> ↑ 動かないとはどうなるんでしょうか。 説明してあるやん。質問読んでます?
guest

回答1

0

・貴方の環境が ASCII文字コード 及び ASCIIを拡張した文字コードを採用していると言う前提で書きます

printf() 及び printf()を使ったプログラムは、規格で定められた方法で貴方が希望した動作をしているはずです

貴方が希望した動作をしていないのは、「表示システム」
テレタイプ社のASR-33と言う機械を探してきて
「入出力端末」として接続し、
貴方のプログラムを実行すれば、
貴方が希望する結果が得られるはず
貴方が使っている「表示システム」?「表示デバイス」?「表示ウインドウ」? は「ASCII互換では無い」のでしょう

いにしえの UNIX が登場し、Cの仕様が定められた時代、
I/O端末としては、メカニカルな TTY(テレ・タイプライタ)が現役でした
→ 活字が飛び出して、インクリボンのインクをロール紙に叩き浸ける
→ テレタイプ社のテレタイプ端末がデファクトスタンダード
→ この時代、タイプライタ部分は CRTディスプレイへの置き換えが進んでいたらしい

テレタイプ社の機械に「後退/復帰/警報」等の "命令" を送る方法が
「ASCII文字コード規格」にて「コントロールコード」として定められました
C言語におけるエスケープシーケンス '\アルファベット' は、ASCIIのコントロールコードに対応します

printf()が行うのは isprint()な文字コードに並べてコントロールコードに分類される文字コードを順に標準出力に送る事だけ
どの文字コードもbyteの並びにすぎない
そして printf() の仕様は ASCII互換端末を前提に定められている
コントロールコードを受け取った表示システムがどう動作するかは表示システムの責任(仕様とも言う)で printf()は知ったこっちゃいない

I/O端末は TTY端末 → CRT端末 → window systemに表示される 仮想TTYコンソール と進化してきましたが
ASCII互換(= テレタイプ社互換)が原則
ASCII互換なら希望どうりの動作をするハズ
→ ASCII互換コンソールじゃなく、ファイルに落としてエディタで見てやると、
コントロールコードが並んでいる事が判る

投稿2021/08/05 19:50

Tirou

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問