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

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

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

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

Q&A

解決済

2回答

663閲覧

自分の記述ミスなのでしょうか

kirbya

総合スコア10

C

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

0グッド

0クリップ

投稿2022/05/26 03:46

こんにちは。いま苦しんで覚えるC言語でCを学んでいる学生です。コンパイラはブラウザ上にあるブラウザで動く C言語実行環境です。
ちょっとわからないことがあったので質問させてください。
なんとなく"strcat"って数値と文字って一緒に結合できるのかなぁというように思いましてこのコードで

#include <stdio.h> #include<string.h> int main(void) { char str[100]; int a; scanf("%s,%d",&str,&a); strcat(str,a); printf("%s",str); return 0; }

実行したところ
イメージ説明のようになりました(1+1=が文字、emseとなったところが数値です)。これはどういうコンパイルがされてこうなったのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

Man page of STRCAT

strcatの第二引数はchar*、つまりcharへのポインタです。
ですから第二引数に普通の数値を入れると、
数値をアドレスとして解釈してそのアドレスを文字列として解釈するので
(データを1バイトずつ\0が出てくるまで見る)
こうなります。

とはいえ通常の環境であれば実行時エラーになると思います。
paiza.IO
Ideone.com で試してみてください

投稿2022/05/26 04:00

編集2022/05/26 04:22
ozwk

総合スコア13512

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

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

kirbya

2022/05/26 04:43

ありがとうございます。コンピュータの中でそんなことが...
guest

0

なんとなく"strcat"って数値と文字って一緒に結合できるのかなぁ

考えることも試すことも良いことだとは思いますが、せめて関数の仕様は確認されたほうが良いかと思います。
その上で、 char* に直値を指定したらどうなるのかと思考を進めると、 c 、ひいては現在のコンピュータの動作原理(!?)の理解にも及ぶのではないでしょうか。

投稿2022/05/26 04:37

jimbe

総合スコア12545

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

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

kirbya

2022/05/26 22:23 編集

どうなんのかなぁって特に何も考えずにやったんですw コンピュータの核心に触れた!?
jimbe

2022/05/26 06:20

核心、ですね。 "今の" コンピュータは与えられた情報を何の疑問も無く使用します。 OS やハード的にガードをする(される)ことありますが、ガード自体が人間が与えるものです。 従って、コンピュータに何をさせるかは全て人間が与えなければならず、結果が人間にとって"間違った動作"( "暴走" とか ”バグ” も含めて)であっても、コンピュータにとっては"正しい動作"となります。 今の殆どのコンピュータはいわゆる「ノイマン型」と言われ、メモリの中に命令・データを入れ、メモリを順に読み出しながらこれを解釈・実行していく方式です。 その「メモリから読み出す位置」を「アドレス」と言いますので、ノイマン型コンピュータにとってアドレスは必要不可欠なものです。 strcat のパラメータはデータのアドレスで、ご質問の状態では大きな問題になりませんでしたが、もしそのアドレスが「コンピュータが次に実行する命令のアドレス」だったらどうなるか。数ギガ・テラにも及ぶメモリ空間の中で、偶然指定したアドレスが「致命的な動作をするプログラム」の開始位置だったら…。そしてもしその動作が偶然では無く何者かがシステムの不備を突いて起こさせたとしたら…。
kirbya

2022/05/26 22:22

あっ...誤字です。 ほんとに気をつけたほうがいいですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問