C言語でのプログラムの最後の桁を消去する方法は?

このQ&Aのポイント
  • C言語で表された数値の各列の最後の桁を消去するプログラムを作りたいです。
  • スペースが数値の間にあるため、ヌルコードの手前の数値を消去するか、桁数を指定して最後の桁を消去するか迷っています。
  • どの関数を使用すればプログラムの最後の桁を消去できるでしょうか?
回答を見る
  • ベストアンサー

C言語でのプログラム

23481 34958 432 ・・・   83829 93828 210 ・・・     ・     ・    ・   ・     ・    ・   ・     ・    ・ 上の様に各列に対して決まったビット数で表示されている数値のデータの 一番最後の桁(一番上の行なら 1、8、2)を消去するプログラムを 作りたいのですが、 各数値の間にスペースがあるので、ヌルコードの一つ手前の数値を消去すると考えたほうが良いのか、それともビット数(桁数)が決まっているので各列に対して最後の桁を指定して消去した方が良いのでしょうか? また、その「消去する」という プログラムには何の関数を使ったら良いのでしょうか? このプログラムへの取っ掛りが見つからず、困っています。よろしくお願いします。

  • davi8
  • お礼率92% (36/39)

質問者が選んだベストアンサー

  • ベストアンサー
  • madman
  • ベストアンサー率24% (612/2465)
回答No.3

データの間にスペースがあるので、このデータがファイルにあると仮定します。 1.1行読み込む(fgets) 2.スペース区切りでデータを区切る(strtok) 3.区切った文字列("23481\0")の最後にNULLをセット   buff[strlen(buff)-1] = NULL; 4.2へNULLまで繰り返す。 5.1行別ファイルに書き出す。 6.1へEOFまで繰り返す。 簡単なロジックかいてみました。 コンパイルもしてませんので、動くかどうかわかりません。 また、エラー回避も入れてません。 試して検証して、改造してご利用ください。 FILE *fpw, *fpr; char buff[1025]; char bf[6]; fpr = fopen("read.txt", "r"); fpw = fopen("write.txt", "w"); while(fgets(buff, 1024, fpr)) { tok = strtok(buff, " "); if (!tok) exit(-1); strcpy(bf, tok); bf[strlen(bf)-1]=NULL; fprintf(fpw, "%s", bf); while(tok=strtok(NULL," ")) { strcpy(bf, tok); bf[strlen(bf)-1]=NULL; fprintf(fpw, " %s", bf); } fprintf(fpw, "\n"); }

davi8
質問者

お礼

アドバイスありがとうございます! 解説付きのロジックなんて本当に助かります。 有効に使わせていただきます。

その他の回答 (2)

noname#8153
noname#8153
回答No.2

ご質問の数値というのは、char型で格納されている文字列なのでしょうか? それとも、intやlongなどで数値型で格納されているのでしょうか? 「決まったビット数で表示されている」というのも意味がよくわかりません。「決まったバイト数(桁数)で何らかの領域に格納されている」ってことでしょうか? 領域に格納された数文字列の最後の1桁を消去すると判断して、私が思いつく方法としては、 1列目のデータの先頭から、strrchr関数でヌルコードを検索しながら、strncatで数字列の長さ-1のサイズで別の用意しておいた領域にコピーして行く。 って感じでしょうか。 関数については、リファレンスで確認してください。

davi8
質問者

補足

質問する側としてのマナーを無視した質問の仕方をしてしまい 申し訳ありませんでした。 数値は、文字列で、おっしゃる通りに決まったバイト数で格納されています。

  • Roba_san
  • ベストアンサー率52% (18/34)
回答No.1

データは、文字列ですか? ファイルからの読み込みですか?それとも電文? 1行のデータ数は決まっていますか? 行の終端は\nですか?NULLですか? その辺がわからないと答え様が無いです。

davi8
質問者

補足

質問するにあたって、最低限の情報を言わずに質問してしまい 申し訳ありませんでした。 ちなみにデータは、ファイルからの読み込みです。 1行のデータ数は決まっています。 行の終端については、¥nです。

関連するQ&A

  • C言語で困っています...

    入力した数値の列だけ○と×を縦に、段々になるように表示する (最後の行は×にならなければいけない)プログラムを作成しています。 (実行例) ○と×を表示します。何列?:10            ×           ○×          ×○×         ○×○×         ×○×○×       ○×○×○×      ×○×○×○×    ○×○×○×○× ×○×○×○×○× ○×○×○×○×○× 途中までプログラミングできたのですが、 偶数の数値を入れたときはきちんと最後の行は×になっても 奇数の数値を入力すると○が最後の行になってしまい、うまくいきません。 どこがだめなのでしょうか? どなたか教えてください。 /* 入力した数値の列だけ、○と×を縦に、   段々になるように表示する(最後の行は×になる) */ #include <stdio.h> int main(void) { int i, j, n; printf("○と×を表示します。何列?:"); scanf("%d", &n); for (i=0; i<n; i++){ for (j=0; j<n; j++){ if (j >= (n - 1) - i){ if (j % 2 == 0) printf("○"); else printf("×"); } else printf(" ");//全角スペース } printf("\n"); } return 0; }

  • C言語のプログラムについて

    C言語のプログラムについて 3桁の自然数の中で、自分自身を含めた約数が奇数になるものがいくつあるかを求めるプログラムを作りたいのですが、swich文を使って、6通りの方法で出そうとしていまして、 while 文、 for文、 do while文に加え、 for文のを、1つの関数として独立させたもの、 さらに、for文のを重ループ部分のそれぞれのループに対応して、2つの関数として独立させたもの、 そして、この2つの関数のどちらともをループを用いずに再帰呼び出しを用いたもの の6通りで出したいのですが、swich文を使うところは自力でできたのですが、あとの6つそれぞれのプログラムの組み方がわかりません。 教えていただけないでしょうか?ややこしい書き方をしてすいません・・・。

  • C言語のプログラムについて質問です。

    C言語初心者で困っています。 テキストデータの上から3行分を飛ばして、4行目から読み込むようにするにはどのようなプログラムを書けば良いでしょうか? ちなみにデータは2列、100003行あります。 よろしくお願いします。

  • c言語のファイル読み込みについて。

    cのプログラムで以下のファイルを読み込む際、指定した行数や桁数などの条件に一致するもののみを読み込むことは出来ますか? 01010101 000250 0003 2008-11-17 16:44 0000 0003-0013-0000 01010101 000250 0005 2008-11-17 11:31 0000 0003-0013-0000 10001000 000150 0002 2008-11-17 16:45 0000 0003-0013-0000 10001000 000150 0004 2008-11-17 11:32 0000 0003-0013-0000                  ・                  ・                  ・ 例えば、 条件1:一桁目が01010101から始まる行の 条件2:13~15桁目(250) を読み込む場合はどうしたらいいでしょうか? 関数を用いて、条件2の桁数指定を変えて他の数値も読み込んで、 それが終わったら次の行に進む形にしたいと思っています。 以下が自分の考えただいたいの構想です。 #include<stdio.h> int Load(); int main(void) { int coad;       //int kakaku,kosuu,mise,jikoku,uriage; //int uriage2[][];       //条件1の指定       printf("商品コード(8桁):"); scanf("%d",&coad); //価格(13~15桁目)、個数(10)、店コード(37)、時刻(33~34)をロード //()内に行数(gyou)、桁数(定数)、条件1(cord)を指定する値 // //kakaku=Load(); //kosuu=Load(); //mise=Load(); //jikoku=Load(); //uriage=kakaku*kosuu; //売り上げ総額を店、時刻ごとに集計↓ //uriage2[mise][jikoku]=uriage[mise][jikoku]+uriage; //gyou=gyou++; // //最下行まで繰り返し return 0; } /* int Load() { } */ わかりにくかったらすいません・・・・ Load関数や()内など、どう記述すればよいでしょうか。 どうかよろしくお願いします。

  • C言語のアルゴリズムについて

    C言語で「標準入力から英語の文章を読み込んで,文字列Ilmorが出現した行をその行番号とともに表示するプログラムを作りなさい.」とプログラムを作りたいのですが、文字列を発見するところまでは分かるのですが、その行どうやって表示すればいいのか分かりません。また、文章を読み込むのもすごくややこしく最後にエンターを二回押すなどの制限があります。(scanf) 参考になるプログラムを書いていただける方いませんか?できればC言語のアルゴリズムについて詳しく書いた本やサイトがあれば教えていただきたいです。 レベルは超入門的な本を2,3冊読んだ程度です。アルゴリズムなどにはまったく触れてなかったし、ライブラリー関数も少ししか載ってなかったので関数の本もあれば教えていただきたいです。

  • 桁数を求めるプログラム。

    入力した数字の桁数を表示させるというプログラムを考えています。 例) 135 この数字の桁数は3桁です。 などと表示させたいと思っています。 それで、私は入力した数値を10で割っていって入力した数値aがa<=0になったらループを終了して 何回ループしたかのカウンタで桁数を表示させようかと考えました。 たとえば135→13.5→1.35→0.135で整数部分が0となるのでループを打ち切って 3回繰り返したので3桁と表示させたいと思いました。 それでプログラムを考えてみたのですが、どうにもうまくいきいません。 どのように修正したら桁数が表示できるようになるでしょうか? #include <stdio.h> main() { double a=0; int n=1; scanf("%d",&a); while(1) { a=a/10.0; if(a<=0){ break; } n++; } printf("その数は%d桁です。\n",n); }

  • C言語をお願いします

    関数の使い方が分かりません、お知恵を貸してください 問題 一桁の整数を入力。 その数を起点として5の段までの九九の表を表示するプログラムを作成。 条件が4つ。 ・下記の実行結果のように表示しなさい。 ・タイトル行(1・・・5)の表示は、main 関数で行う。 ・入力した数を起点とした5の段までの九九の表を表示する関数 func99 を作る。 ・そのうち乗算部分は、func_mul 関数を作る。 5(入力) 実行例 1 2 3 4 5 //ここはプリントで出力 5 10 15 20 25 6 12 18 24 30 7 14 21 28 35 8 16 24 32 40 9 18 27 36 45 10 20 30 40 50 数字部分は%5dでお願いします

  • C言語です。よろしくお願いします

    何をすればいいのかがさっぱりです 文字列を入力 入力された文字列について 次の(1)~(6)のすべてを表示するプログラムを作成 (1) 全文字の合計文字数 (2) 数字の文字数 (3) 英大文字の文字数 (4) 英小文字の文字数 (5) 空白の文字数 (6) その他の文字の文字数 データの読み込みはgetchar 関数を使用 実行例 total = (1) numeric= (2) large = (3) small = (4) space = (5) other = (1)-(2)(3)(4)(5) よろしくお願いします

  • C言語で、数値の桁数を求めるには??

    C言語で数値の桁数を求めるプログラムをもとめたいのですが どうすればいいのでしょうか int c; int a; c=12345; a=printf("%d",c); とするとaに桁数は入るのですが cがPRINTF関数により表示されてしまいます どうすればいいでしょうか? わかる方はおしえてください、おねがいします。

  • C言語での並び替えのプログラム

    A[6][5]={{"abei"}, {"aceh"}, {"adeg"}, {"aef"}, {"bcfi"}, {"bdfh"}}; と配列があるとします。 (a).A[1][5]の文字列とA[2][5]の文字列を比較して、"abceih"という組み合わせた文字列を作り、その文字列の数を出します(この場合6個)。次に、A[3][5]のA[4][5]を比較して組み合わせて文字列を作り、その文字列の数を出します。A[5][5]とA[6][5]も同じように比較して組み合わせて文字列を作り、その文字列の数を出し、最後にそのすべての数の和を出します。 (b).この配列を並べ変えて(a)をします。 並び替え方は配列6個のとき 1.(1)(2)(3)(4)(5)(6) 2.(1)(2)(3)(5)(4)(6) 3.(1)(2)(3)(6)(4)(5) 4.(1)(3)(2)(4)(5)(6) 5.(1)(3)(2)(5)(4)(6) 6.(1)(3)(2)(6)(4)(5) 7.(1)(4)(2)(3)(5)(6) 8.(1)(4)(2)(5)(3)(6) 9.(1)(4)(2)(6)(3)(5) 10.(1)(5)(2)(3)(4)(6) 11.(1)(5)(2)(4)(3)(6) 12.(1)(5)(2)(6)(3)(4) 13.(1)(6)(2)(3)(4)(5) 14.(1)(6)(2)(4)(3)(5) 15.(1)(6)(2)(5)(3)(4) の15通りになります。 この配列の並びを前から配列を2つずつ取り出して比較すれば全組み合わせが完了したことになります。 この15通りの組み合わせの中で総和が一番少なくなる組み合わせ方を探すプログラムを作りたいのです。 そしてこのとき、配列が最大で40個までとなることがあるとするとその並べ替えのプログラムはどうなるでしょうか? 比較するプログラムは作ることに成功しましたが並べ替えのプログラムがうまく作れません誰か教えていただけないでしょうか?