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

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

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

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

Q&A

解決済

5回答

3033閲覧

char 変数に値を代入

ryusei_12

総合スコア11

C

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

0グッド

0クリップ

投稿2020/03/04 06:00

この前コードを記載していたら、
ちよっと困ったので、教えて下さい。
以下にとりあえずコードを大まかに記載します。

#include <studio.h> int main(int argc, char *argv[]){ char get; //ここに1文字格納したい。 //何かしらの処理をしてargv[1]を代入 return 0; }

•前提条件
argv[1]には1文字格納されてる。

•実施したこと
strcpy(get, argv[1]);
get = argv[1][0];

ということをしました。
方法として、自分的にあまり納得できていません。

1つ目、strcpyに関しては、使い方的に良いのか?
2つ目、argvを二次元配列みたいに扱って良いのか?
という部分です。

ここで何か他にしっくりくる方法が他にないのか?ということで質問しました。

以上です。よろしくお願いします。

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

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

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

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

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

guest

回答5

0

argv[1]には1文字格納されてる。

とは? strcpy()は、1文字なら終端'\0'を入れて2文字コピーするので、get(1文字)には入りません。
・・・補足strcpy(get, argv[1]);は、strcpy(&get, argv[1]);の間違い?

get = argv[1][0];あるいは、get = *argv[1];が正解のように思います。

投稿2020/03/04 06:43

編集2020/03/04 06:55
cateye

総合スコア6851

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

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

ryusei_12

2020/03/04 07:49

回答ありがとうございます。 ご指摘ありがとございます。
Y.H.

2020/03/04 09:03

代入じゃなくてむりやり関数使うなら strncpy(&get, argv[1], 1); とか。
guest

0

ベストアンサー

strcpy(get, argv[1]);strcpy(&get, argv[1]); の間違いですね。

非配列のオブジェクトは大きさ 1 の配列と同じレイアウトを持つので、長さ 1 の配列に対してコピーするのと同じように strcpy を使えなくはないです。 コピー元の配列がコピー先の配列よりも大きいときに未定義の動作となるので前提条件が絶対確実であることは確認しておく必要がありますが……。


ポインタと配列の関係が非常に分かり難いのですが、配列は一部の例外を除いてその配列の先頭要素を指すポインタに型変換されるというルールがあり、それは二次元配列にアクセスするときにも適用されるルールです。

たとえば

c

1char foo[100][10];

と宣言された foo があるとき、 foo[10][5] としてアクセスしようとするとまず foo[10] を評価して char [10] 型の値が得られるのですが暗黙の型変換よって char* になってからそれに対して [5] を適用するという順序が取られます。

一方で、ポインタが入ってる配列の bar をこのように宣言したとします。

c

1char *bar[100];

このとき bar[10] を評価した結果の型は char* です。 二次元配列で暗黙の型変換が適用された場合と同じになります。

なので、ポインタが入った一次元配列は見かけ上は二次元配列と同じ文法で扱えるのです。

投稿2020/03/04 06:30

SaitoAtsushi

総合スコア5437

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

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

ryusei_12

2020/03/04 06:39

回答ありがとうございます。 とても詳しく記載いただき勉強になります。 ちなみにこのような動作定義?みたいなものは、どこかで知ることはできまさか? 結論、どっちかの方法でオッケーということですかね? もし他の方法が、こっちの方がいいよと言うのが有れば教えて頂きたいです。
SaitoAtsushi

2020/03/04 07:02

日本語の文書は JIS 規格になっている JISX3010:2003 です。 正規で購入するとすごく高価ですが、見るだけなら日本産業標準調査会のサイトで見れますので検索のページで X3010 と入れてみてください。 https://www.jisc.go.jp/index.html ただ、 C の仕様の原本である ISO が発行しているものはたまに改定されています。 JISX3010:2003 (← 2003年に発行) は ISO/IEC 9899:1999 (←1999年に発行) を元にしたものです。 現在の最新は ISO/IEC 9899:2018 (←2018年に発行) なので、 JIS だと時代遅れということになりますね。 ISO が発行しているものも高価で、日本円で二万円ちょっとくらいです。 https://www.iso.org/standard/74528.html 正式な規格書は異様に高いのですが、制定中の草案 (ドラフト) は無料で見れるようです。 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf
Y.H.

2020/03/04 08:59

> strcpy(get, argv[1]); は strcpy(&get, argv[1]); の間違いですね。 > 長さ 1 の配列に対してコピーするのと同じように strcpy を使えなくはないです。 > ・・・略・・・前提条件が絶対確実であることは確認・・・略・・・ この場合 「前提条件が絶対確実である」というのは「(int)strlen(argv[1]) == 0 が真である」 ということなので > argv[1]には1文字格納されてる。 を満たすことができないのでstrcpy()は使用できないですね。
rubato6809

2020/03/04 09:16

> strcpy() を使えなくはない がBAとは納得できないので低評価をつけました。
SaitoAtsushi

2020/03/04 10:09

なんか条件が変な感じでしたね。 ヌル終端を込みで 1 文字ならということで。 (argv でそういうことはまずないとは思いますが。)
guest

0

回答してくださった方々
ありがとうございます。

回答いただいた内容を
参考にさせて頂きます。

またよろしくお願いします。

投稿2020/03/04 07:51

ryusei_12

総合スコア11

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

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

0

strcpy(get, argv[1]);
が誤りであることについては、既に解説されている通りです。

ただ、変数名の get は標準関数名とバッティングするのでお勧めできません。
変数名の命名も大事ですよ。

投稿2020/03/04 07:09

DreamTheater

総合スコア1095

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

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

maisumakun

2020/03/04 07:37

「get」だけの名前の標準関数はなかったかと思います。
ryusei_12

2020/03/04 07:48

変数名の命名も大事ですよ。 →ありがとうございます。今後注意します。 ちなみに関数名や変数名決めるときってどのように決めてますか?
DreamTheater

2020/03/04 22:43

> maisumakunさん ご指摘ありがとうございます。 gets(),fgets()等でしたね。。。 > ryusei_12さん 命名ルールは開発チーム(プロジェクト)で規約が規定されている場合があります。 「変数名 命名規約 C言語」等で検索すると、参考になるサイトが見つかると思います。 尚、個人意見ですが「ハンガリアン記法」はお勧めしません。
guest

0

2つ目、argvを二次元配列みたいに扱って良いのか?

という部分です。

特に問題ありません。C言語の文字列はcharの配列です。

投稿2020/03/04 06:02

maisumakun

総合スコア145121

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

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

ryusei_12

2020/03/04 06:37

回答ありがとうございます。 結論、試みた方法が無難ですか? 他に何かできそうですか?
maisumakun

2020/03/04 07:37

> 他に何かできそうですか? 逆に伺いますが、このままだと何が不満なのでしょうか。(strcpy版はやめたほうがいいのは他の回答のとおりですが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問