2ちゃんねる ■掲示板に戻る■ 全部 1- 最新50    

0からの、超初心者C++相談室

1 :デフォルトの名無しさん:2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net
何にも知らない0からの出発、超初心者のためのC++相談室

843 :1:2024/05/29(水) 05:15:45.12 ID:fgEqna2o.net
なに?プログラムって。むつかしそうだなー
ぜんぜん知らないんだけど、ちょっとやってみたいなー

ってな人も、入れてあげてね。
そういうスレなんだから。

844 :デフォルトの名無しさん:2024/06/11(火) 02:11:04.90 ID:T9Og4Yet.net
質問です。
独習でc++勉強してるのですが掛け算して出力するっていう練習問題見ててふと気づいたのですがこの本一体どの文字コードで保存すること考えて書いてるんだ?っていう疑問が出てきました。
sjisだとちゃんと日本語表示されるけど汎用性ないよな?ってことでUnicodeで書くこと前提で勉強したほうがいいよなって思ったんですが下のコードだと何を直せばいいのでしょうか?


#include <iostream>
using namespace std;

int main()
{
double hours, wage;

cout << "労働時間を入力する: ";
cin >> hours;

cout << "時給を入力する: ";
cin >> wage;

cout << "合計賃金は" << wage * hours << "円\n";

return 0;
}

845 :はちみつ餃子 :2024/06/11(火) 05:44:39.09 ID:oZDOZRBo.net
>>844
データの型としては unicode を扱えるようになってるけどコンソールは言語の外の話なので Unicode を扱えるかどうか、使えるにしてもどう切り替えるのかは言語仕様としては決まってない。
Unicode で出力は出来るけどそれを理解して表示できる環境かどうかはわからないということ。

846 :デフォルトの名無しさん:2024/06/11(火) 10:47:36.44 ID:GrH0S5VC.net
実行環境を変える
setlocale()するとか

847 :デフォルトの名無しさん:2024/06/11(火) 15:21:46.44 ID:T9Og4Yet.net
>>844
つまり、自分のところの文字エンコード使えってことでしょうか?
動作的には目的通りできますし、環境次第で文字表示はどれ使えるか変わってくるしで

>>846
実行環境はこの環境で使えるプログラム組めるまで気長にやるつもりなのでなしです。
setlocale()使ったことないのでよくわからないのですがロケール宣言してその中で日本語使ってみたらってことですか?

848 :デフォルトの名無しさん:2024/06/11(火) 16:20:37.40 ID:ILw6YbJs.net
長らくVS触ってなかったんであまり役に立たんかもしれんけど
・Visual Studioでutf-8でソース書く方法
http://tech.hikware.com/article/20171020a.html

・Win32APIをutf-8で使う
https://learn.microsoft.com/ja-jp/windows/apps/design/globalizing/use-utf8-code-page

C++標準ライブラリに関してはロケール設定でいけるんじゃなかったっけ、違ってたらすまん

849 :デフォルトの名無しさん:2024/06/11(火) 16:33:04.86 ID:ILw6YbJs.net
https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-170
下の方にsetlocaleでutf-8指定する方法書いてる
で、ソースコードもロケールもutf-8になってりゃ>>844のコードそのままでutf-8で実行してくれるはずよ

850 :デフォルトの名無しさん:2024/06/11(火) 16:50:13.04 ID:ILw6YbJs.net
https://learn.microsoft.com/ja-jp/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-170
すまん、実行時もソースコードもオプションに/utf-8入れるだけだったわ
setlocaleしなくていい

utf-16にしたいんだったらまた別だけど

851 :はちみつ餃子 :2024/06/11(火) 17:31:31.68 ID:kKWOd8Cb.net
>>847
言語仕様には書いていないことだから実行環境 (OS やターミナル) のドキュメントを読んでねってこと。
色々な文字コードをサポートしていることもあるししてないこともある。
切り替えることが出来ることもあれば出来ないこともある。

それとストリームはリダイレクト (接続先の変更) される可能性がある。
やりたいことによっては
標準出力がターミナルに繋がっているときとファイルに繋がっているときを区別しなきゃならないかもしれない。

Unix 系 OS の場合はテキストを表示するのはターミナルで、ターミナルはごく普通のアプリケーションのひとつ。
OS 自体はアプリケーションとターミナルの仲立ちをしてるだけなんだけど……。

Windows の場合は標準のテキスト画面 (コンソール) は Windows に標準的に備わった特別なもの。
その特別なテキスト画面を使ってる間は Windows のドキュメントに書いてある通りにすればいいのだけど
Windows で別のターミナルを使うときはその制御方法の規格が確立してないから
主要なターミナルを判定して場当たり的な処理をしているのが現状。
近年は ConPTY という規格が使われ始めてるけどどんなターミナルもそれをサポートしているってわけではないから
結局は場当たり的に対処すべき対象が一個増えただけって感じ。 (将来的には統一されるといいなぁ……)

更に Windows は C ランタイムサポートが文字コード変換の機能も持っていて接続先を勝手に判定して
変換することがあって、その挙動がかなりわけがわからない。

色々あるけどまとめると「こうすればいい」という簡単な説明が出来ない入り組んだ事情があるって話。

852 :デフォルトの名無しさん:2024/06/11(火) 22:55:22.54 ID:T9Og4Yet.net
すいません。
私の環境ただ単にUTFが使用可能になってなかっただけでした。

853 :デフォルトの名無しさん:2024/06/12(水) 16:16:19.83 ID:HDPWhZcO.net
termcap/terminfoとか
init.d
inittab
getty

854 :デフォルトの名無しさん:2024/06/13(木) 02:54:21.20 ID:PAaiBuyr.net
人間に匹敵する知能を持った汎用人工知能を開発した研究者に総額100万ドルの賞金を授与するコンテスト「ARC Prize」が開催

855 :デフォルトの名無しさん:2024/06/15(土) 17:34:41.45 ID:kg6WNOQa.net
>>844

C++は、日本語対応していないよ、注意してね。
だから、"あいうえお"なんかのコードは実行されない。
俺はこれを理解するのに10年以上かかった。

856 :はちみつ餃子 ◆8X2XSCHEME :2024/06/15(土) 19:41:12.56 ID:g9ixUcaw.net
>>855
No.
現在は Unicode についての規定はあるし、 Unicode のコードポイントに対応つくことが保証された文字列リテラルはある。

857 :858:2024/06/15(土) 21:31:29.30 ID:kg6WNOQa.net
俺のエディタは、EmEditor Professional (64-bit)だ。
だ。だからC++は、C++17だ。
わからなかった。ごめんな。

858 :デフォルトの名無しさん:2024/06/16(日) 00:50:11.77 ID:v0fD0nKy.net
C++と文字コードに関してはこの記事が面白かった
https://qiita.com/yumetodo/items/54e1a8230dbf513ea85b
俺もあまり詳しくはないから全部理解できた訳じゃないけど、筆者の人がブチギレまくってるのを感じ取るだけでも面白かった

859 :デフォルトの名無しさん:2024/06/16(日) 23:06:40.05 ID:+HL215mo.net
>>854
どうやってチューリングテストするんじゃ……

860 :デフォルトの名無しさん:2024/06/16(日) 23:21:48.48 ID:+HL215mo.net
coutやcinとかなiostream系の入出力手段のうちのワイド文字でないやつは
エスケープ文字('\\'とか)や書式指定文字('%'とか)に依存しないから
つまりたまたまマルチバイト文字の一部が '\\' や '%' に一致してもなんら実害が無いから
Shift JISの入出力が問題を引き起こすことは無いという認識でおk?

861 :はちみつ餃子 ◆8X2XSCHEME :2024/06/16(日) 23:45:30.66 ID:Crm/SwBu.net
>>860
言語仕様的にはテキストモードでは実行環境の都合で各種の変換を入れても良い。 (入れなくても良い)
実際に Windows では文字コードや改行コードの変換をする。
改行が \r\n であるようなテキストを読んでも内部的には \n であるように扱えたりしてるのを不思議に思ったことない?
変換するということは変換元が想定通りじゃないときには破綻する可能性がある。
Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。

バイナリモードではバイト列そのまま。

Linux だとテキストモードとバイナリモードは区別がない。

862 :デフォルトの名無しさん:2024/06/17(月) 00:54:42.78 ID:pXzMaPAe.net
>>861
だいたいわかりた、
>実際に Windows では文字コードや改行コードの変換をする。
テキストモードにおける '\n' <--> '\r\n' 変換をやるだけでも、
cout << "アイウエオカキクケコ\nさしすせそ" << endl;
と書かれたうちの '\n' と endl の2箇所だけ正確に変換するためには、
上記1行の中に暗黙に含まれるSI/SOおよび2バイト文字の「区」を表す上位バイトを
「実行時に」解釈する必要がある
つまりランタイムはASCIIのつもりで文字列を解釈しては駄目で、
Shift JISというものを知っている必要があり、これが
>Shift JIS を使う設定にしてないときに Shift JIS を渡したら駄目かもね。
につながるんだと思う。

863 :デフォルトの名無しさん:2024/06/17(月) 00:57:00.44 ID:pXzMaPAe.net
しかし
>実行環境の都合で各種の変換を入れても良い。
とC++の仕様には書いてあると言っても実際には透過的でない文字コード変換とか有り得ないんでないので?
例えば
ofstream ofs("foo.txt"); ofs << "アイウエオカキクケコ\nさしすせそ" << endl; // (1)
std::string s1, s2;
ifstream ifs("foo.txt"); ifs >> s1 >> s2; // (2)
とやったらs1、s2とも中身は(1)の記述をコンパイル時に解釈した通りになる、
という期待動作しかありえないのでは……
具体的には
s1の中身は SI アイウエオカキクケコ SO の12バイト(末尾NUL除く)になって、
s2の中身は さしすせそ という10バイト(末尾NUL除く)になる、

864 :デフォルトの名無しさん:2024/06/17(月) 01:13:07.47 ID:pXzMaPAe.net
いやトチ狂ったスマンヌ、
Shift JISの2バイト文字は上位下位ともコントロールコード('\r' や '\n' を含む)とはバッティングしないから
>>862 の理解はやや的を外していた……orz
テキストモードにおける '\n' <--> '\r\n' 変換は、ランタイムがShift JIS文字列をASCIIとして解釈してそれを行っても何ら問題を生じない。

しかし、であればやっぱ>>860に戻って、実は実害無いのでは……
Shift JISの2バイト文字は上位下位とも数字とかともバッティングしないようになっているし……
透過的でない文字コード変換(>>863)が無い限り、cout して cin して結果が変になるケースが思いつかなsげ……
(正確には char c; cin >> c; で 2バイト文字 "陰" の2バイト目を "A" として受け取ってしまう、系の避けようが無い事故は除く

865 :デフォルトの名無しさん:2024/06/17(月) 16:31:20.06 ID:prlYSpwu.net
wstringがutf-32だったら良いのに

866 :デフォルトの名無しさん:2024/06/18(火) 11:56:24.49 ID:mldi07Wv.net
>>858
その人ブチギレてるフリしてるだけの厨二病だから・・・

302 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver.24052200