• ベストアンサー

期待する文字列

KojiSの回答

  • KojiS
  • ベストアンサー率46% (145/312)
回答No.3

> 考え方がおかしかったのでしょうか? > 関数の使い方は合ってると思うんですが。 > 関数の使い方が間違っている、正確にはどのように動いているかを把握しきれていない、という感じです。 とりあえず、実際にどのようにコーディングしているかを、要所を抜粋して書き込んでくだされば、何かアドバイスできるかもしれません。

nagaruru
質問者

補足

心強いお言葉ありがとうございます。 ソースファイル貼りつけましたので、ご面倒かけますがアドバイスお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> char *true_num(void); /* 期待数値入力関数宣言 */ char *input(int *); /* 数値入力関数宣言 */ char *expand_memory(char *, int*); /* バッファ拡張関数宣言 */ char *decimal(char *, int *); /* 小数点チェック関数宣言 */ char *num_check(char *, int*); /* 数字チェック関数宣言 */ int main() { printf("data\n"); printf("data\n%s\n",true_num() ); // 動作確認のため return 0; } /* 期待数値入力関数 */ char *true_num(void) { int *p_option, option = 1; char *number; p_option = &option; while(option) //期待する文字列が入力されるまでループ { number = input(p_option); } return number; } /* 数値入力関数 f(バッファ拡張関数) */ char *input(int *option) { char *str = NULL, *ent = "(enter)", // 改行のみのときenter表示のため *number; // realloc第1引き数にNULL指定でmallocとして機能 int index = 0, remainder = 0; // メモリーの残り変数 for(;;) { if(remainder == 0) str = expand_memory(str, &remainder); *(str + index) = getchar(); if( *str == '\n') { str = ent; // 改行のみ入力時、文字列エンター表示 break; } if( *(str + index) == '\n') // 文字列の終わりの書き込み { *(str + index) = '\0'; break; } index++; remainder--; } return decimal(str,option); } /* バッファ拡張関数 */ char *expand_memory(char *buff, int *rem) { const int SIZE = 5; int size = 0; size += SIZE; *rem = SIZE; buff= realloc(buff, size); return buff; } /* 小数点チェック関数 */ char *decimal(char *data,int *option) { int flag=0, posit; // 確認フラグ char *pflag, // '.'の位置 *number; pflag = data; while(flag < 2) // '.'の個数検索 { pflag = strchr(pflag + flag, '.'); if(pflag == NULL) break; else flag++; } switch(flag) { case 2: // 小数点2個以上 printf("set error!\a\n"); break; case 1: posit = strchr(data,'.') - data; // 小数点1個を含む文字列 *(data + posit) = '0'; // 小数点の書き換え isdigitでエラーになるため number = num_check(data,option); *(data + posit) = '.'; // チェック後データの復元 break; case 0: // 小数点を含まない文字列 number = num_check(data,option); break; } return number; } /* 数字チェック関数 */ char *num_check(char *data,int *option) { int len, flag, posit, *end; len = strlen(data); for(posit=0; posit < len; posit++) // 各配列の値を1~0か参照 { flag = isdigit( *(data + posit) ); if(flag == NULL) { printf("set error!\a\n"); break; } } if(flag != NULL) { end = option; // ここまでデーターが流れてくると文字列の実数になる *end = 0; // ループ脱出のための書き換え } return data; }

関連するQ&A

  • 整数を文字列として認識したい

    整数を文字列として認識したいんですが、可能なのでしょうか? 例えば、i=12470というint型の整数があるとして、1万の位の数1や、十の位の数7だけを取り出したいんです。 しかし、この際、1万の位の数1をi/10000、十の位の数7を(i%100)/10などというようにしては取り出したくないんです。 ややこしい質問ですが、よろしくお願いします。 というのも、整数を文字列として認識する目的は、int型として送られてきたデータが本当に整数なのかをチェックするためだからです。 初心者なので合っているか分かりませんが、整数を文字列として認識できれば、isdigit関数を使うことで、データが本当に整数なのかをチェックすることができるのかなあと考えているんですが・・・ もし、私の考えが間違っていたり、他に良い方法があったら是非教えて欲しいと思います。

  • ”123456”といった整数を文字列に変換、その後、文字列を1文字ごとに整数に変換 

    忙しい中失礼します。 http://oshiete1.goo.ne.jp/qa3424254.htmlでも質問させて頂いたものですが、 今、回答してくださった方の意見を参考に以下の過程をこなそうとしています。 1.整数入力 →scanf関数を使用し、"123456"と入力します。 2.整数を文字列に変換 → printf("Write the SIN: \n");   scanf("%d", &fnum);   printf("%c\n",fnum); で、"123456"と数値を入力しても”123456”という値が返されず、@となってしまいます。 どうすれば入力した数値が文字列として返ってくるのでしょうか? どんな文・関数を使用すれば数字を文字列として使用することが可能になるのでしょうか? 今のところ習っている文はif else, swith case, while for,do whileで、 getcharやstr?(string)という関数は習っていません。なので、どうプログラムを書けばいいのか??さっぱりなのです。 でもgetcharやstr?(string)という関数を使用するしか方法はないものなのでしょうか?  また、それから 3.文字列を1文字ごとに整数に変換  にする場合、どんな文・関数を使用すれば、1文字”ごと”に整数に変換できるのでしょうか? ごめんなさい、分からないのです。プログラム文、ヒントもしくは参考になるページ等があれば教えて下さい。 よろしくお願いします。 <使用環境:フリーソフト(Borland?)C ANSI C>

  • 文字列の中から1~5桁の数字を抜き出したい

    ある命令プログラムを作っているのですが、文字列の中に命令語を書いてその後に続く数字を抜き出したいのですがうまくいきません ソースを見ていただきたいのですが @ke の命令語の後で1~5桁の数字を記載しているのですが 数字の部分を文字から数字に変えたいのです。 その後 @ke 数字 を正式な命令文として扱いたいのですがソースを見ていただけるとわかると思いますが問題があります。 ・文字をatoiで数字に変換できない(キャスト演算子を変えてもだめだった) ・ソースのプログラムの書き方ではやたらと長々しくなってしまう。 どのようにしたら問題が解決できますか? ----以下ソース---- #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int main(){ char kei[100]="abc@ke 4567def@ke 789"; int i=0; int g=NULL; while(i<15){ if(kei[i]=='@'){ i++; if(strnicmp(&kei[i],"ke ",3)==0){ i+=3; //後に続く数字を抜き出して処理したい if(isdigit(kei[i])){ if(isdigit(kei[i+1])){ if(isdigit(kei[i+2])){ //・・・・以下全部で5桁分の数字を判定していく けど正直こんなややこしい方法をとらなくてもスマートにできるはず } else{ g=(atoi(kei[i])) * 10 +atoi(kei[i]); //型名が違うからatoiに入らないといわれる } } else{ g=atoi(kei[i]); //型名が違うからatoiに入らないといわれる } } else{ printf("\n命令の仕方が間違っています\n"); } } } else{ printf("%c",kei[i]); i++; } } return 0; }

  • ヘッダーファイル"jctype"について

    昨夜はお世話になりました。 今日はCのヘッダファイル"jctype"についてです。 例の文字列検索プログラム作成中に、 "iskanji"関数という存在に気づきました。 関数名から日本語環境用と思われますが、 jctypeがBorland C++ Compiler には存在しないようですので、 どなたかその関数を利用する方法を教えてください。 宜しくお願いします。

  • 文字列を数字型に変換したい

    いつもお世話になっております。 eclipseというツールでC言語のプログラムを触っているのですが、 文字列の数字を数値型に変換して掛け算をしたいのですが、 型変換の関数はありますでしょうか??

  • 大文字の文字列→小文字の文字列

    C言語初心者です。 ある演習問題をやっていて詰まっています。 自分で入力した大文字の文字列を小文字にするプログラムを作るという問題なのですが、↓の条件があり、こんがらがってしまいました。 ・入力した文字列に小文字が含まれていたら、エラーと表示して再び入力を促し、0を入力するとプログラム終了という流れにする。 ・ポインタ変数を使う。 ・continue文を使う。 ・標準ライブラリ関数は使わない。 です。 ・continue文というのがよくわからない。 ・宣言した関数でどの処理をすればいいのかわからない。 ・大文字を小文字にするというプログラムがわからない。 (アスキーコードをどう使うのか) でつまっています。 どなたかアドバイス・解説・模範解答・指摘などしていただけないでしょうか。 よろしくお願い致します。

  • 16表記の文字列を数字に直したい(C/C++標準関数)

    16表記の文字列を数字に直したい(C/C++標準関数) 例えば、"FF”な255 or -127という風に16表記の文字列を数字に直すC/C++の標準関数はありますか? なければ、どのようなやり方で行っていますか? VxWorksのprogramを開発しようとしているのですが、どんな標準関数が使えるのか、 直接契約していないので分かりません。 組み込み製品の説明書にはC/C++の仕様の説明書がないですね。 VxWorksでsupport されている標準関数はどんなものがあるかもご存知の方教えてください。 シリアル通信のプログラムで伝聞がASCIIで書かれていて、数値は10進だったり、16進だったりします。

  • 文字列がNULLか空文字列かの判定

    Visual C++で、Cのプログラムを作成しているものです。(OS:WinNT 4.0) 文字列の扱いについて、質問します。 関数 int func(char *str) があると仮定します。 パラメータとして、strは以下のような状態あるとします。 (strは関数が呼ばれる前にcalloc()で領域確保済み)  シンボル名 値  str      0x00000001 "" 上記の状態で、strがNULLか空文字列("")であることを条件式にしたいのですが、str == NULL は偽となり、strcmp(str, "") を使用すると異常終了します。 どうしたらよいのでしょうか。アドバイスをお願いします。

  • 文字列の比較

    現在Cでプログラムをつくっているのですが いきずまってしまいました。 1.テキストファイルを読み込む 2.書き込みファイルを開く 3.読み込んだデータを一行読み込んで   その行の特定の文字列があれば、   特定の文字列のみ取り出し、   書き込みファイルに書く。    4.次以降の行も同じ処理をする。    5.読み込み、書き込みファイルを閉じる。 と、こんな感じのプログラムなのですが、 3の特定の文字列をどのように取り出せばいいのかわかりません。 取り出したいのが数字ならば、if文でできるのですが 文字列の場合は、どうなんでしょうか。 例えば、「MOJIRETU11」という取り出したいとき 数字と同じようにIF文を使用することは、できるのでしょうか。

  • char*型の文字列を表示させたい。

    char*型の文字列を表示させたい。 char*型の文字列をウィンドウに表示させるプログラムを作っているのですが、 調べても分からなかったので、質問させていただきます。 コンパイラはBorland C++で、プラットフォームはウィンドウズです。 Textoutのようにウィンドウに出力させたいのですが、うまくいきません。 うまく行かないと言うのは、C言語でのプログラムの書き方が分からないと言う事です。 ある文字列をファイルから読み込んで、ウィンドウに表示させると言うプログラムを作っています。 http://wisdom.sakura.ne.jp/system/winapi/win32/win15.html このような感じにしたいのですが…。宜しくお願い致します。 ちなみにこの質問をさせていただいたものです。 http://oshiete1.goo.ne.jp/qa3342727.html