こんなプログラムがありました。
char str[80];

while(scanf("%s",str)>=1){
   ・・・
 }
このwhileループは何が入力されたときに終了するのですか?scanf関数は入力された文字を返り値に持つとわかったので、改行コードを入力しましたが、終了しませんでした。どうすればよいのでしょう。よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

要はEOF(End-Of-File)を示すキャラクタを入力するんですが、


UNIX系ならCtrl+D、DOSなら確かCtrl+Z。
VCとかはいじったこと無いんですが、何なんでしょう?

ちなみに、例のプログラムの動作を見れば分かると思いますが、
改行記号は%sと%sの区切りとみなされます。他に区切りと認識される
記号は、スペースとタブです。
    • good
    • 0
この回答へのお礼

やりました。動きましたよ。ありがとうございました。

お礼日時:2001/06/13 14:46

コンソールアプリで


Ctrl+ZそしてEnterとすると「EOF」が入り
終了すると思います。
    • good
    • 0
この回答へのお礼

ctrl+ZでEOFが入るんですね。ありがとうございました。

お礼日時:2001/06/13 14:48

scanfで数値を読み込む場合などには、このような手が使われる場合があります。



scanfは実際に値を入れられたパラメータの数を返します。
例えば"%d"など数値待ちのときに文字列を入力すると、変数側では受け取れないと判断して、値は読み込まれません。
このとき入力した値はバッファ内に残ってしまうので、gets等をつかって読み捨てる必要があります。

例:数値が入力されるまで、入力を無視する。
  int a;
  char s[100];

  printf("整数を入力してください。");
  while (! scanf("%d", &a))
    gets(s);
  printf("入力値は%dです。\n", a);
    • good
    • 0
この回答へのお礼

懇切丁寧に説明していただいてありがとうございました。

お礼日時:2001/06/13 14:47

もう一度C言語のリファレンスを読み直してください。


int scanf(char *format [, ...]);
なはずです。
scanfは入力(代入)されたパラメータの数を返します。

したがって[改行コード](またはNullキャラクタ)と
いう文字列がstr[]に格納されるため、scanf()の
戻り値は1となり、whileのループからは抜けません。
ループから抜けるには[EOF]を入力する必要があります。

ただし、このwhile()の使い方はしくじると無限ループにに陥る可能性があるので正しく使う必要があります。
    • good
    • 0
この回答へのお礼

まだまだ調べ不足でした。ありがとうございました。

お礼日時:2001/06/13 14:45

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QChr(13)とChr(10)の違いは?

myStr = Replace(myStr, Chr(13), "")

myStr = Replace(myStr, Chr(10), "")

で、改行を置換しているのですが、どちらかでも改行できる時や
どちらかじゃないと改行できない時があります。

そもそもChr(13)とChr(10)の違いはなんでしょう?
どちらも改行ですよね?
何が違うのでしょう?

Aベストアンサー

こんにちは。お邪魔します。

Chr(10) ・・・ ラインフィード ・・・ 略して、Lf

Chr(13) ・・・ キャリッジリターン ・・・ 略して、Cr

改行文字に何を使うのかはアプリケーションが規定するものです。

Win・Office環境では
上のふたつを組合わせた改行[CrLf]を使うことが多いと思います。
次に[Lf]、そして、[Cr]

なので、ソースによっては
  myStr = Replace(myStr, vbCrLf, "")
と、一発で置換できるケースも少なくないです。
■ソースごとに改行文字を確認しておくことから始めた方が有利になります。■

ひとまず、VBAでの改行の扱いに慣れるには
■VBAで用意された文字列定数について知っておいた方がよいと思います。■
 VBE(Visual Basicの編集画面)が開いている状態で、
 F2 キー → オブジェクトブラウザー起動
 検索小窓に、vbCrLf、とタイプして、検索ボタン
 VBA.Constantsクラスのメンバーが表示され
 その中にすべての改行文字(文字列定数)が含まれています。
 そのまま、F1 キーでヘルプを表示します。
詳しい説明はヘルプを読む方がいいでしょう。

実践的な話として、
Chr(10)やChr(13)は関数の戻り値です。
対して、
vbLfやvbCr(またはvbCrLf)は定数です。
定数で済ませられるなら、定数の方が何かと有利です。
定数の名前は略号ですから、実態をイメージし易くなっています。
定数の扱いに慣れることをお奨めします。
例)
  myStr = Replace(myStr, vbLf, "")
  myStr = Replace(myStr, vbCr, "")
  myStr = Replace(myStr, vbCrLf, "")

もしも文字列定数を先に覚えていたなら、疑問にもならなかったのかも知れませんね。
私の場合は、改行の何たるかを覚える前に文字列定数覚えていて、困ることありませんでしたから。

以上、ご参考まで。

こんにちは。お邪魔します。

Chr(10) ・・・ ラインフィード ・・・ 略して、Lf

Chr(13) ・・・ キャリッジリターン ・・・ 略して、Cr

改行文字に何を使うのかはアプリケーションが規定するものです。

Win・Office環境では
上のふたつを組合わせた改行[CrLf]を使うことが多いと思います。
次に[Lf]、そして、[Cr]

なので、ソースによっては
  myStr = Replace(myStr, vbCrLf, "")
と、一発で置換できるケースも少なくないです。
■ソースごとに改行文字を確認しておくことから始めた方が有利...続きを読む

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

QエクセルVBAのChr(10)の挿入と削除

宜しくおねがいします


現在結合されたセルがありそのセル内に他のプログラムから
下記の値が挿入されるようになっています。

あいうえお
かきくけこ
さしすせそ
たちつてと
(Chr(10)の改行)
(Chr(10)の改行)
(Chr(10)の改行)
(Chr(10)の改行)


他のプログラムから送られてくる値は”あ行”の1行だけだったり
”ま行”までの7行あったりとその都度変わってきます。
文字数も”あ”の1文字だけだったり”あああいいいうううえええおおお”と
文字数も変わります。

しかし下の4行分の”Chr(10)の改行”の数は変わりません。


やりたいことは↓

コマンドボタンを二つ作り、ボタンを押すたびに下にあるChr(10)の改行を
挿入したり削除したりしたいのですがどのようにすればよいのでしょうか?
追加ボタンを2回押すとChr(10)の改行が6行分になり
そこから削除ボタンを3回押すとChr(10)の改行が3行分になる・・・という感じです。


試しにマクロの記録で

セルを選択して改行を削除

をしてみたのですが思うような動きをしてくれません。

なぜChr(10)なのかとかいうのは聞かないでください・・・
そこから説明すると長くなるので。

宜しくおねがいします


現在結合されたセルがありそのセル内に他のプログラムから
下記の値が挿入されるようになっています。

あいうえお
かきくけこ
さしすせそ
たちつてと
(Chr(10)の改行)
(Chr(10)の改行)
(Chr(10)の改行)
(Chr(10)の改行)


他のプログラムから送られてくる値は”あ行”の1行だけだったり
”ま行”までの7行あったりとその都度変わってきます。
文字数も”あ”の1文字だけだったり”あああいいいうううえええおおお”と
文字数も変わります。

しかし下の4行分の”Chr(10)の改行”の数は変わ...続きを読む

Aベストアンサー

Sub CommandButton1_click()
 activecell.value = activecell.value & vbLf
End Sub

Sub CommandButton2_click()
 dim buf as string
 buf = activecell.value
 If right(buf, 1) = vbLf then
 activecell.value = left(buf, len(buf) - 1)
 end if
End Sub

単純に足したり削ったりするだけのようですが。

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

QVB、chr関数を一覧で印刷できる?

Chr(10)が改行だとかは、どこでどうやって探すの?
一覧表みたいに印刷できる?

Aベストアンサー

MSDNで ASCII文字セット を調べればわかりますよ。
ちなみに、8、9、10、13 は制御文字で、それぞれBackSpace、TAB、LF、CR ですね。

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む

QChr関数のラインフィールド文字って?

EXCEL2000のVBAを勉強しているものです。
Chr関数のラインフィールド文字ってどんなことが
できるのでしょうか?調べると「復帰」とかかれているのですが・・
実際に使ってみても何がどう変わっているのかがわかりません。
chr(10)
とすると、どうなるのでしょうか?教えてください。
よろしくお願いいたします。

Aベストアンサー

こんにちは。maruru01です。

文字コード10のラインフィードは、Excelではセル内改行になります。
セルの書式設定の[配置]で、[折り返して全体を表示する]にチェックをしておいて、
そのセルに、

Range("A1").Value = "1行目" & Chr(10) & "2行目"

と書き込むと、セル内改行されます。
ちなみにVBの定数を使用して、

Range("A1").Value = "1行目" & vbLf & "2行目"

とも出来ます。

なお、通常のWindows改行は、Chr(13) & Chr(10)で、VBの定数は、「vbCrLf」ですが、これを使用して、

Range("A1").Value = "1行目" & vbCrLf & "2行目"

とすると、セルの表示は、

1行目・
2行目

という風に、Chr(13)が表示出来ずに、中黒になってしまいます。

Qif(str=='a' || str=='b' || str=='c')これまとめられませんか?

題名どおりなんですが短縮してかけませんか?

Aベストアンサー

Perlなどではこういうのは正規表現で
if ( str =~ /(a|b|c)/ )

なんていうように書けます.
C言語でも正規表現を使うためのライブラリはある
(正規表現,C言語などのキーワードで検索して探してください)
ので,それを探して使うのもありかもしれません.

QChr関数であいうえお順に

Chr関数であいうえお順に文字をエクセルに書き出そうとしたけど、
単純にはいかないのですかね?

Sub test()
Dim MyRow As Long
Dim i As Long

For MyRow = 1 To 51
Cells(MyRow, 1) = Chr(-32096 + i)
i = i + 2
Next MyRow

End Sub
これを実行すると、濁点が入ったりするのですが、
綺麗に「あ~ん」まで取得する方法はありますか?

複雑なコードを作るしかないのですかね?

Aベストアンサー

Chr(-32096 + i)



Mid("あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん", i, 1)

あたりに変えればできませんかね?
文字列部分は別途変数に入れて分離しても可です。

Qchar str[256]の256の意味は?

よく入門者などにchar str[256]という記述があります。

この256という数字には何か特別な意味があるのですか?
勿論2の8乗から来ているのでしょうが。

charって1バイト=8ビット=256ですよね。
str[256]というのを良く見かけるので、最初strは最大256個しか確保できないと思っていました。
でも、実際は1000でも良いのですよね。


ということで、どうして256という数字を使うのですか?
意味ありげな数字を使われると、初心者は混乱するので100とか200とかの方が良いと思うのですが。
特別な理由があるのでしょうか?

Aベストアンサー

ちょっと一言。

1バイト(8ビット)で表現できるのは、
符号なしの場合
 0(00000000)~255(11111111)
符号ありの場合
 -128(10000000)~127(01111111)
です。
256は表せません。

ついでにもう一言。
char str[256];
って「ファイルの名前」とか「ファイル中の1行」を
格納するために定義されることが多いでしょう。
私の場合は、
「名前(or 1行の文字数)が256文字もあるファイルは滅多に無いだろう」
「でも128文字ぐらいならあるかも。ちょっと不安」
「かといって512文字は多すぎるかな」
ってことで256にしてます。
はじめから文字数がわかってるときは32とか64にしたりもしますが。
(なんで2のべき乗なのかはNo.1の通りです。)


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング