scanfについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ダッシュ

scanfについて

#1

投稿記事 by ダッシュ » 17年前

小数点のトピについてですが、いまあの文章を読む余力がないので、次の週末にじっくり読んで、またレスしようと思います。その時はお付き合いください。
((名前についてですが、管理人さんがこうした方がいいと判断されたならいくらでもOKです。

scanfやっててエラーが出ました。ソースは・・・

#include<stdio.h>

void main(){

int a[/url];
char b[/url];

printf("数字を記入せよ");
scanf("%s",a);

printf("文字を記入せよ");
scanf("%s",b);

printf("あなたのタイプした数字は%sです。",a);
printf("あなたのタイプした文字は%s.",b);
}

a,bのサイズが不明、あるいは0みたいなのが出ます。

管理人

Re:scanfについて

#2

投稿記事 by 管理人 » 17年前

ダッシュさんこんばんは^^
調子はどうですか?
-------
前提知識。
回答の中で配列要素数という言葉を使用しています。
配列要素数というのは読んで字の如く配列要素の数なんですが
int a[3]と宣言するとint型の格納が出来る要素とよばれる1つの単位が3つ作られますね。
この事を「配列要素数3つで宣言した」といいます。
-------


では回答しますね。
int a[10];
char b[10];
こんな感じで設定する配列要素数を書けば解決します。
といいますのも、
char b[/url];
ではコンパイラがいくつの配列要素を用意すればいいかわからないからエラーになるのです。
でも配列要素が省略できる場合がありましたね。
char b[/url]="abc";
こんな時です。
文字列は文字列の最後に最後である印"\0"を代入する必要があります。しかし宣言と同時に文字列を指定したり(上記の場合の事です)、関数で文字列を代入する時は自動的に文字列の最後に
ヌル文字\0がいれられますから自分で書く必要はありません。
char b[/url]="abc";
このように宣言した時、配列の中身はどうなっているでしょうか。
このようなプログラムで確認することが出来ます。
配列要素を一つずつ表示しています。

#include<stdio.h>
void main(){
char a[/url]="abc";
printf("%c\n",a[0]);
printf("%c\n",a[1]);
printf("%c\n",a[2]);
printf("%c\n",a[3]);
}

実行結果
a
b
c


このような実行結果になりました。この実行結果から
a[0]にはaが
a[1]にはbが
a[2]にはcが格納されている事がわかりますね。
本当は
a[3]には\0が代入されているのですが、ヌル文字は表示させても見えないので空欄になっています。
では本当にa[3]には\0が入っているのかどうか判定するプログラムを作ってみます。

#include<stdio.h>
void main(){
char a[/url]="abc";
  if(a[3]=='\0')
    printf("入っています。\n");
}

実行結果

入っています。


ほら、ちゃんと入っていましたね。つまり、b[/url]のように配列要素数を省略した時は、
宣言時に、指定した文字列の長さ+1個分(ヌル文字格納用)の配列要素数を自動的にコンパイラが用意するのですが
b[/url]の後に何の文字列をいれるのか指定してやらなければコンパイラはいくらの要素数を用意すればいいのかわからずエラーになるのです。
ですから宣言と同時に文字列を格納しないのならば
scanfで代入するために必要な配列要素数を指定してやる必要があります。

例えばキーボード入力から
1234567890
という文字列を受け取るためには10個+1個の計11個の配列要素が必要になりますから配列の宣言は
int a[11];
になります。入力される文字列の長さが決まっていないときには十分多い値にしましょう。

ダッシュ

Re:scanfについて

#3

投稿記事 by ダッシュ » 17年前

こんばんは。

おお~。できました。要するに[/url]内に具体的に数字をいれとかないといけないわけですね。また、もし入れないなら=abcのように宣言しとかないといけないと言うことですよね?

それと[/url]内に数字を入れなければならないということは、限りなく記入させることは出来ないということですか。

なんかちょっと感激です。今まではただ表示されるだけだったのが、自分が打って、それをプロンプトさんが返してくれる。今までと少し違いますね☆

p.s.調子のほうですが、なかなかペースがあがってくれません。それでも15日には絶対間に合わせたいので頑張ってます。(今日はノートにソース書いて学校で予習してましたww)

管理人さんはリニューアル進んでます?

管理人

Re:scanfについて

#4

投稿記事 by 管理人 » 17年前

> 要するに[/url]内に具体的に数字をいれとかないといけないわけですね。また、もし入れないなら=abcのように宣言しとかないといけないと言うことですよね?

はい、ただ文字列はダブルコーテーションで囲ってくださいね。
char a[/url]="abc";
こんな感じで。

> [/url]内に数字を入れなければならないということは、限りなく記入させることは出来ないということですか。

はい、現段階ではユーザーは配列を作る時に宣言の要素数を指定する事はできません。
(別な方法でやろうと思ったら出来るんですけど難しくなるので省略します。とりあえず[/url]には宣言と同時に代入しないのなら要素数は書かないといけません。)

別にユーザーがこの値を指定する必要は無いと思います。
ユーザーが30文字程度の文字列を扱うのだったら50程度の配列要素を準備していれば十分ですし、十分に準備して悪い事はありません。
千個準備したからといってメモリが足りなくなる事もないですしね。

>今まではただ表示されるだけだったのが、自分が打って、それをプロンプトさんが返してくれる。今までと少し違いますね☆

そうなんですよね。私もその時思いました。
次に感じる時は視覚的・聴覚的効果を作成出来たときですよ。
自分が作ったプログラムが画像などで表示されたらとても感動します。
ゲームプログラムの醍醐味はそこにあるんでしょうね。

> 調子のほうですが、なかなかペースがあがってくれません。

危機迫ったり、学校でやらないといけないわけでもないのに、きちんとここまで勉強されている姿は立派だと思います。
私も高校の時にCを触りましたが結局奥深く出来ませんでしたから。

> 今日はノートにソース書いて学校で予習してました

いいことです^^

> 管理人さんはリニューアル進んでます?

はい、今作っているところですが、公開ソフトの件では様々な支障が出てきて・・。
ソフト公開できない可能性がでてきました・・。

ゲームプログラミングの方では、順調に作ってるんですが、
これまた、ゲームプログラムの方法を書いていくと一つのゲームを作ってしまうようなレールで説明していると
私が示すとおりのゲームを作らせてしまう事になり、
どうしたらいいか悩んでいます。
しかもアルゴリズムを長いプログラムの文章で説明すると読むのがダルクなるでしょうから短くしたいですし、
短くするとたいした説明が出来ないと、
ジレンマにはまってしまって、どうしたらいいか悩みながら作っています。
まぁ、作りながら要望を募ってもいいですね。

ダッシュ

Re:scanfについて

#5

投稿記事 by ダッシュ » 17年前

ソフトが公開できない?プログラムの方面でですか?それとも法律関係?(そりゃないか・・・)

なにはともあれ、15日 楽しみにしてますよ。


ちょっと馬鹿げた質問かも知れませんがきいて下さい。
唐突ですが、ハッカーっているじゃないですか。あの人たちも、やっぱりCとかでウィルス作ってたりするんですか?
 いや、勘違いしないで下さいよ。僕は悪用しようとしてるわけじゃありません。
僕が見た映画の中で「The core」ってのがあります。何年か前に出ましたよね。その中に超凄腕ハッカーみたいのがいてウィルス作ったり、システムに侵入したりとか余裕でこなすんですよね。
それ見てて僕のいつもの癖で、「か、かっこいい。。」と思っちゃったわけです。そういうのってC言語極めたらできるもんなのですか?
くどいですが、あくまで興味本位からの質問です。

管理人

Re:scanfについて

#6

投稿記事 by 管理人 » 17年前

そうですね。ウィルスってどういう定義とするかですが。
コンピュータの使用を妨げる不正プログラムというものがウィルスというと某辞書にのっていますが、
そんなプログラムなら1分でかけますよね。
実行したら特定のソフトを無限に呼び出したり、無限にファイルを作成したり、裏で無限ループをしていたりすれば
使用は妨げられますし、処理も遅くなるでしょう。
どんなウィルスか質を求めなければいくらでも作れますよ。
別にCであろうが、JAVAであろうが実行ファイル形式で配布するんでしょうから何で書いても不正プログラムは作れます。
無限ループプログラムとはこんな感じのものです。
#include<stdio.h>
void main(){
int i;
while(1){
printf("%d",i);
i++;
}
}

http://dixq.net/board/exe/virus.exe

これ実行してみてください。危険なものじゃないので大丈夫です。
ある程度みたら×ボタンで閉じてください。

仮にこの画面が閉じられないとしたら、パソコンに詳しくない人は怖いと思うでしょう。
かってにこんな画面がいくつもいくつも出てきたら。

どんなものをウィルスとするかですね。
トロイの木馬とかどこにファイルがあるか隠したり、いかにウィルスが進入している事をきづかせずに感染させるか
質をあげようとすればドンドン難しくなっていくでしょう。

何の言語って事はないですよ。色んな言語で書かれたものがあるとおもいます。
まぁ、Cでもそりゃもちろん作れますよ。
ついでにウィルスもどきなら誰でも作れますし。
昔ウィルスもどきファイルを送って友達と遊んだものです。
「ウィルスに感染しました。」
「被害が拡大しています。」
「ハードディスクをフォーマットしています。」

そんなシステムメッセージを表示させたりしてね。

**この記載はウィルス作成を助長するものではありません。ウィルスを作る事は犯罪です。しかしウィルスの内容等をを知る事で感染を防ぐ事は大事な事です。**

ダッシュ

Re:scanfについて

#7

投稿記事 by ダッシュ » 17年前

クリックしてみたんですけど実行できませんでした。アプリケーションでハンドルできない例外が発生しました。とか、でました。

でも、現実のハッカーってどうしてウィルスばら撒くとか、マイナスなことしかやらないんでしょうね?それだけ能力あるなら、もっと皆の役に立つもの作って欲しいですよ。そのほうが絶対かっこいいけどなぁ。

管理人

Re:scanfについて

#8

投稿記事 by 管理人 » 17年前

あら、まぁいいです。
上記のプログラムを実行しただけですから。
きっと自分の作ったプログラムが問題になってニュースなんかになると自分のスキルが認められた気分になるんでしょうね。
人には出来ない自分は勝った賢い人間だと。

有名になるんならビルゲイツみたいな感じに有名になったほうが100倍いいですもんね。
あの人1000億円恵まれない人に寄付して、なおかつ余生は慈悲活動に徹するそうですよ。すごい人です全く。

バグ

Re:scanfについて

#9

投稿記事 by バグ » 17年前

ひょっとしたら、変数 i におかしな値が入っていたのかもしれませんね。初期化されてないみたいですし(^_^;)

管理人

Re:scanfについて

#10

投稿記事 by 管理人 » 17年前

何?! イージーミス・・・。
その通り初期化していませんでしたm(_ _)m

あれ、バグさん始めましてですっけ??・・違ったらごめんなさい^^;

先ほどダッシュさんが違う名前で投稿されてらっしゃるのかなと思って書いたもので、、、^^;

バグ

Re:scanfについて

#11

投稿記事 by バグ » 17年前

あ、紛らわしかったですね。こちらでは初めまして(笑)
mixiの『教えあうC言語』というコミュニティで、コラムスを作っていた者です(笑)

管理人

Re:scanfについて

#12

投稿記事 by 管理人 » 17年前

あ~!!
テトリスをコマンドプロンプトで作ってらっしゃった方ですね!
ご指摘アリガトウゴザイマス★

mixiからこちらにいらっしゃった方初めてです^^
いや、いらっしゃったかどうか聞いてないだけかもしれませんが^^;

先ほどのfloatの比較わかりました?

閉鎖

“C言語何でも質問掲示板” へ戻る