![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.13ベストアンサー
- 回答日時:
別の方法を考えてみました。
----------------------------------------------------------------
#include <stdio.h>
#include <string.h>
void main()
{
int a[ 3 ];
char buf[ 256 ];
char *p;
int count = 0;
// 入力
gets( buf );
p = buf;
while( *p != '\0' )
{
// 数字がある所までシフトする
p += strcspn( p, "1234567890" );
// 数値の抽出
sscanf( p, "%d", &a[ count++ ] );
// 数字以外の所までシフトする
p += strspn( p, "1234567890" );
}
// 表示
printf("%d %d %d\n", a[0], a[1], a[2] );
}
----------------------------------------------------------------
関数の説明:
strcspn( p, "1234567890" ) : 先頭から数字以外で構成される長さを取得する
(例) "abc1234efg" なら "abc"の部分が該当するので結果は3である
strspn( p, "1234567890" ) : 先頭から数字で構成される長さを取得する
(例) "1234efg" なら "1234"の部分が該当するので結果は4である
今回のはどうでしょうか?
またわからない箇所がありましたら
追って質問してくださいね(^_^)
(PS:BLUEPIXYさん、調査報告ありがとうございました。)
No.10
- 回答日時:
BlueStonesです。
プログラム上は問題ないはずなので、
システム上の問題だと思うのですが。
なにぶん、そちらと同じ環境を整えることができませんでしたので、
確認することができないのですが。
詳しい原因箇所がわかりましたら
ご連絡をいただけないでしょうか?
No.9
- 回答日時:
BlueStonesです。
お手数ですが、
あなたの開発環境は何でしょうか?
この回答への補足
学校でやっているのでよく分かりません。
RedHatLinux8.0だったと思います。
コンパイラは何を使っているのか不明です。
No.8
- 回答日時:
どうも仕様がはっきりしないので、自信なしですが、こういうことでしょうか?
-- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< --
#include <stdio.h>
#include <ctype.h>
#define NMAX 100
int
main(void)
{
int c;
int sum, save, i, n;
int a[NMAX];
printf("input numbers & ^D at last.\n");
n = 0;
sum = 0;
save = 0;
while ((c = getchar()) != EOF) {
if (isdigit(c)) {
sum = sum * 10 + (c - '0');
save = 1;
}
else if (save) {
printf("input[%d] = %d\n", n, sum);
a[n++] = sum;
sum = 0;
save = 0;
if (n >= NMAX) break;
}
}
for (i = 0; i < n; i++) {
printf("a[%d] = %d\n", i, a[i]);
}
return 0;
}
No.7
- 回答日時:
……えっと?
ごめん、私には貴方の話が見えない。
#01への補足
・12 3→1と2と3
と、私(#06)へのお礼
・実際は50とかぐらいまで
が整合するか?
前者の言を取るなら、数値はすべて一桁になるし、後者の言を取るなら前者は12と3か123にならなければおかしい……よね?
真坂、12は1と2 だけど 1.2は12 として読む…なんて不思議仕様じゃないでしょう?
一度話を整理してくれんか
質問しつつ、自分でもプログラムをいじっている内にいろいろと仕様の変更がありました。
すいません。
12,3は12と3です。数字が繋がっていればそれは一つの数字としてみようと思っています。数字以外の文字全ては区切り文字として扱う予定です。最悪、", . "ぐらいは区切り文字として認識させるつもりです。
#1の補足は誤りでした。ごめんなさい。
No.6
- 回答日時:
0-9の数値を取り込むのですよね?
char fgetc(FILE*) で一文字取得できます。(標準入力はstdinよ)
ただし、これは「文字列」では無く「文字」なので、atoi()には渡せないと思います。
これを解決する方法は複数考えられます。
1.「文字」を「文字列」にする
2.「文字」用のatoiを作る。
1.「文字」chを「文字列」szに変換する方法
char ch,sz[2];
// 中略
sz[0] = ch;
sz[1] = '\0';
……うん、スマートじゃないね。
2.「文字」用のatoi的関数を作る方法
int ctoi(char ch)
{
switch((int)ch) {
case '0': return 0;
// 以下略
}
}
main(){
// 略
if(isalnum(ch))
a[i] = ctoi(ch);
// 略
}
回答ありがとうございます。
私がやると、0~9までの一文字でしか出来なかったと言うだけで、
実際は50とかぐらいまでは入れます。
あと、数字もそれと同じく3つではなく、もっと多くとります。
No.4
- 回答日時:
atoi()は使っていませんが、こんなのはどうでしょうか。
#include <stdio.h>
void main()
{
int a[ 3 ];
char buf[ 256 ];
int count = 0;
int ret;
// 入力
gets( buf );
// 初期読み込み
ret = sscanf( buf, "%d%[^\0]", a, buf );
// 文字列がまだ残っているなら処理する
while( 1 < ret && count < 3 )
{
// 数値の抽出
ret = sscanf( buf, "%*[^0-9]%d%[^\0]", &a[ ++count ], buf );
}
// 表示
printf("%d %d %d\n", a[0], a[1], a[2] );
}
----------------------------------------------------------------
説明:
まず、入力を文字列として取得します。
それをsscanf()で処理します。
sscanf():文字列変数から入力を読み取るタイプのscanf()です
ここで大事なのが、書式フォーマットの部分です。
まず、%dで数字部分を取り出してa[0]に代入します。
そして、%[^\0]で残りの文字列をbufに代入します。
%[^\0]:'\0'以外の文字からなる文字列を取得
retには代入に成功した数が入るので、
数字だけ代入されたなら1が
文字列が残っていてそれがbufに代入されていたら2が代入されます。
もしここで2が代入されていたらwhile文の中を処理します。
while文の中のsscanf()では
書式フォーマットに%*[^0-9]が追加していることに注意してください
%*[^0-9]:0~9以外の文字からなる文字列を取得
('*'指定はそれを取得するだけで代入はしないという指定です)
これで後はretが1以下になるまで処理を繰り返せば
配列に数字が代入されていきます。
説明が長くなってしまいましたが、わかりましたでしょうか^_^;
実際に打ち込んでみて確認すると良いと思います。
では、がんばってください♪
この回答への補足
やってみたのですが、何故か上手くいきません。
で、確かめてみると、retは14になっていたり、bufは変化していなかったり・・・
4,5,6と入力すると、4としか表示されません。
どうしてなんでしょうか?コピーして使ってみたんですが・・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
反転した数値を表示させるやり方
-
C言語の課題です
-
charと%c , %s の関係について
-
itoaわかりません
-
fgetsで拾われる改行文字を削除...
-
C言語について。
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
O(n log n)について2
-
大学数学の問題です。 加法群Z/...
-
#define _CRT_SECURE_NO_WARNIN...
-
教えてください。数学Bの二項分...
-
「Aに対するBの割合」と「Aに対...
-
EXCELの分散分析表のP-値が....
-
Enterキーを押されたら次の処理...
-
プログラムでの数字につく”f”の...
-
fgetsなどのときのstdinのバッ...
-
配列を使って魔方陣
-
独立係数について教えて下さい。
-
迷路を脱出する経路探索プログ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
fgetsで拾われる改行文字を削除...
-
C言語 空白の行(改行のみ)が...
-
itoaわかりません
-
Cで「大文字、小文字の判定」は...
-
文字列中に含まれる文字の個数...
-
C言語で16進数文字列から16進数...
-
strstrを利用しない文字列検索...
-
小文字のみを数える方法
-
C言語のステップ数をカウントす...
-
C言語でパスワード作成ツール
-
単語数のカウントについて
-
str[j++]の意味
-
fgetsでバッファ残留文字列を無...
-
教えていただけませんか?C言語...
-
エディットボックスに入力され...
おすすめ情報