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

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

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

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

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

2回答

3322閲覧

C言語の文字列リテラルについて

wilddown

総合スコア34

C

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

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2016/06/17 10:57

編集2016/06/17 12:40

分かりにくくて申し訳ありません。C言語の文字列リテラルについてなのですが、文字列リテラルを変数か何かに保存することはできないのでしょうか?ゲームで、遊び手がキャラクターに名前を付けたりできるようにしたいのですが、やり方がいまいちわかりません。scanf関数を使っても、うまく保存されません。

scanf_s("%c", &pass); printf("%c で設定しました。\n", pass);

このような命令で、scanfでアルファベットやかな文字を入力しても、printfの時には違う値が表示されました。(書式文字を%sにしてもだめでした。)
DXライブラリも勉強しているので、それを使った方法があればそれでも構いません。
文字列リテラルを保存する方法はないのでしょうか?まとまってない文章ですみません。

追記
申し訳ありません。passはint型です。
すみません。うまく言い表せなかったのですが、私が言いたかったのは、変数か何かに文字データ(数値ではなくて)を保存できないか?ということです。

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

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

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

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

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

cateye

2016/06/17 11:20

passの型は何でしょう? また、文字列リテラルとは0文字以上の連続した文字列を示す定数。 上のコードでいえば'%c"や"%c で設定しました。\n"の事です。何か勘違いしていませんか?
guest

回答2

0

ベストアンサー

C言語では、文字列はchar配列として扱います。
また、scanfおよびprintfでの書式は%sです。

C

1char pass[100]; 2scanf_s("%s", pass); 3printf("%s で設定しました。\n", pass);

このような感じで試してみてください。


追記
文字列リテラルをchar配列の変数に格納する方法

C

1// 文字列リテラルを直接変数に設定するやり方です。 2// 文字数+1(ヌル終端の分)のサイズになります。 3char str1[] = "abcd1234"; 4 5// 文字列リテラルをchar配列変数にコピーするやり方です。 6char str2[10]; 7strcpy_s(str2, "abcd1234");

文字列の連結はこのようにやります。

C

1char str[10]; 2strcpy_s(str, "abcd"); 3strcat_s(str, "1234"); 4// strには"abcd1234"が入ります。

char配列のサイズは、必ず文字列を格納するのに十分な大きさ(文字数+1以上)を設定してください。

投稿2016/06/17 11:57

編集2016/06/17 13:12
catsforepaw

総合スコア5938

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

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

wilddown

2016/06/17 12:19

なぜでしょうか?あと一人の回答者の方のところにも書いたのですが、「ハンドルされない例外が 0x675D3FD4 (msvcr120d.dll) で発生しました(pass.exe 内): 0xC0000005: 場所 0x008F0000 への書き込み中にアクセス違反が発生しました。」というエラーが出ます。
catsforepaw

2016/06/17 12:28

書いてはいけない場所にデータを書き込もうとしたときに出るエラーです。確保した領域を超えてデータを書き込もうとしたり、不正なアドレスに対して書き込みを行おうとするとそうなります。 提供されている情報だけでは原因は判りません。もう少し広い範囲でソースコードを開示していただければ何か判るかもしれません。
wilddown

2016/06/17 12:35

別に変な記述をしているわけではないんです。 #include<stdio.h> int main(){ char pass[100]; scanf_s("%s", pass); //今回はaaaaaaaaaaaaと入力しました。 printf("%s で設定しました。\n", pass); } という最低限のコードだけでもそのエラーが出ます。
catsforepaw

2016/06/17 12:50

> scanf_s("%s", pass); そういえば、標準関数ではなくセキュリティ強化版の`scanf_s`でしたね。これ、ちょっと使い方が違います。 このように変更してください。 scanf_s("%s", pass, 100); scanf_sで文字列を入力する際は、入力バッファーのサイズも渡さないといけないのです。
cateye

2016/06/17 12:57 編集

scanf_s()の仕様を確認しましたか? 文字列の場合はサイズが必要です。「参考」http://www.eonet.ne.jp/~maeda/cpp/scanf.htm 被ったw 文字列であれば素直にfgets()をお勧めします。
wilddown

2016/06/17 13:01

ありがとうございます!できました。 質問の連続で申し訳ないのですが、scanf_s関数以外で、変数に文字列を保存するにはどうすればいいのでしょうか?また、二つの文字列を足して、一つの文字列にしたい場合、どうすればいいのでしょうか?(例えば、passに「aaaa」,possに「bbbb」の文字列が入っていて、「aaaabbbb」の一つの文字列にまとめるという場合) 初歩的な質問なのかもしれませんが、どうかお願いいたします。
catsforepaw

2016/06/17 13:06

回答の方に追記します。
cateye

2016/06/17 13:15 編集

変数に文字列を保存する→標準入力(キーボード)からの入力なら、fgets(str,sizeof str,stdin); 文字列連結にはstrcat()を使います。最新はstrcat_s()かな? →http://support.tenasys.com/intimehelp_6_jp/strcat.html
catsforepaw

2016/06/17 13:15

cateyeさん コメントが前後してしまってすみません。フォローありがとうございます。
wilddown

2016/06/18 08:56

何から何までありがとうございました!ほんと感謝感激です。 助かりました!はやく初心者の域から脱するためにも、勉強を進めていきたいと思います。 他の方々もありがとうございました!
wilddown

2016/06/18 09:46

何度も何度も繰り返しほんとすみません!もう一つだけ質問よろしいでしょうか? 文字列リテラルを収納する変数を、配列変数でまとめる場合はどうすればいいのでしょうか? 例えば、添え字0にはa、1にはb、2にはc といったように文字列リテラルを配列変数に収納して、 for(int n;n<27;n++){ printf("%s"str[n]); } というふうにしたら、a~zが順番に表示されるようにしたいのです。 毎回毎回わかりにくい質問で本当に申し訳ありません!
catsforepaw

2016/06/18 09:57

関連する質問ならともかく、配列絡みとなると当初のご質問の主旨からはだいぶ離れますので、コメントではなく別件として新たに質問された方が、より多くの人に見てもらえると思います。
wilddown

2016/06/18 10:00

そうですね。すみませんでした。
guest

0

scanf_s("%10s")
このようにバッファサイズを入れてください。

投稿2016/06/17 11:09

Zuishin

総合スコア28656

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

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

wilddown

2016/06/17 11:18

そのようにしてみたのですが、例えば、scanf_s関数で「fhalhueaha」とでたらめに入力しても、printf関数で表示されるのは先頭の「f」だけでした。 せっかく教えていただいたのにすみません。うまくできませんでした。
Zuishin

2016/06/17 11:23

どのようにしたのかバッファの定義や出力も含めて書いて下さい。 デバッグ作業には情報が必要です。
wilddown

2016/06/17 11:48

scanf_s("%10c", &pass); printf("%10c で設定しました。\n", pass); %sだと、「ハンドルされない例外が 0x675D3FD4 (msvcr120d.dll) で発生しました(pass.exe 内): 0xC0000005: 場所 0x008F0000 への書き込み中にアクセス違反が発生しました。」というエラーが出ます。 まだまだ初心者で、何もわかってなくてすみません。書き漏らしがあったら指摘お願いいたします。
Zuishin

2016/06/17 11:50

https://msdn.microsoft.com/ja-jp/library/w40768et.aspx ここをご覧になったらいかがかと思います。 ひっかりそうなところとしては、バッファを終端文字の分も確保しなければならないこと、引数に&をつけないこと、バッファサイズを指定すること、S書式指定子の文字幅がややこしいことくらいでしょうか
Zuishin

2016/06/17 11:54

とりあえず今ある情報からわかる明らかな間違いは「&」をつけていることですね。 他の部分は書いてないのでわかりませんが。
wilddown

2016/06/18 10:12

すみません。解決いたしました。中途半端な形になってしまい申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問