• 締切済み

空白文字について

C言語の初心者です。 今、VC 6.0の環境で電卓を作っています。 エディットボックスに数値を入力して計算させるプログラムなのですが エディットボックスにスペースを入力されても計算出来るようにしたいのですが解りません。 NULL文字をチェックすればよいのか、それとも「isspece」の関数を使って空白文字を調べればよいか解りません。プラス「+」、マイナス「-」の符合が入力されても計算出来るようには行えたのですが、どうしても空白(スペース)を入力された場合が、うまくいきません。 作成途中のソースコードです。ご指導お願いします。 // OnButton1() ///////////////////////////////////////////////////////////////////// void CKasanDlg::OnButton1() { adding(); char num1[128],num3[128]; int i,length=strlen(&num1[0]); int numk,numl=0; m_num3.GetLine( 0, num3 ); numk = sscanf( num3, "%d", &numl ); for( i=0; i<length; i++ ){ isdigit( (int) num1[i] ); } if(( numk == -1 )){ MessageBox("数値を入力してください。"); // メッセージボックス } } // 足算 (num) ///////////////////////////////////////////////////////////////// void CKasanDlg::adding() { char num1[128],num2[128]; int number1=0, number2=0,sum=0; CString ans; int nums,numa; int i=0, m=0, add1=0,add2=0; m_num3.SetSel( 0,-1 ); m_num3.Clear(); m_num1.GetLine( 0, num1 ); int length1 ; if(( num1[ 0 ] == '-' ) || ( num1[ 0 ] == '+' )){ length1 = strlen ( &num1[1] ); for( i=0; i<length1; i++ ){ add1 = isdigit( (int)num1[i+1] ); if( add1 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・左側)"); break; } } } else{ length1 = strlen ( &num1[0] ); for( i=0; i<length1; i++ ){ add1 = isdigit( (int)num1[i] ); if( add1 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・左側)"); break; } } } m_num2.GetLine( 0, num2 ); int length2; if(( num2[ 0 ] == '-' ) || ( num2[ 0 ] == '+' ) || ( num2[ 0 ] == ' ' )){ length2 = strlen ( &num2[1] ); for( m=0; m<length2; m++ ){ add2 = isdigit( (int)num2[m+1] ); if( add2 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・右側)"); break; } } } else{ length2 = strlen (&num2[0]); for( m=0; m<length2; m++ ){ add2= isdigit((int)num2[m]); if( add2 == 0 ){ MessageBox("10進数字以外の値が入力されています。\n(足算・右側)"); break; } } } if((add1 == 0 ) && ( add2 == 0)){ return ; } if((add1 == 0 ) && ( add2 != 0)){ return ; } if((add1 != 0 ) && ( add2 == 0)){ return ; } nums = sscanf( num1, "%d", &number1 ); numa = sscanf( num2, "%d", &number2 ); if(( nums == 1) && ( numa == 1)){ sum = number1 + number2; ans.Format( "%d",sum ); m_num3.SetSel( 0, -1 ); m_num3.Clear(); m_num3.ReplaceSel( ans ); } } ///////////////////////////////////////////////////////////////////////////////

みんなの回答

  • master000
  • ベストアンサー率33% (16/48)
回答No.3

こんにちは ソースを読ませていただきまして、一言。 問題を取り違えているような気がします。 電卓の製作はよく課題として登場してきますが、多くはn桁電卓製作です。 配列に1桁ずつ数値に直して入れて計算するプログラムを製作するのではないでしょうか。 引き算や負の加算は補数計算で行う。 このあと、掛け算、割り算を追加して電卓を完成させるという課題のような気がします。 取り違えていたらorz

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス >NULL文字をチェックすればよいのか、  ↑  これは違う。 >それとも「isspece」の関数を使って空白文字を調べればよいか解りません。  ↑  『isspace』関数で空白文字の判定が出来ますので文字列の解釈位置を1つ進めれば良いです。  あるいは空白文字だけをカットして別の文字列領域にコピーしてから解釈させるなどします。  どちらの方法でも可能ですがソースコードを見ると最初に空白文字だけをカットして別の  文字列領域にコピーしてから空白文字がない文字列を処理させた方が良さそうです。  GetLine() 関数の次の行に空白文字をカットする処理を記述すれば良いでしょう。 ・以上。

mumu712m
質問者

お礼

Oh-Orangeさん mumu712mです。 的確なアドバイスありがとうございます。 このような場合は「isspace」関数で空白を見つけ「Trim」関数で削除する順序になるのでしょうか? まだC言語を習い始めて1ヶ月弱で知識不足です。 出来ましたら、どのように記述するかコードを見せていただけると大変、助かります。 何卒、宜しくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

普通は isspace ではないかなぁ? NUL 文字と比較する意味がわからん.

関連するQ&A

  • POJ 2718

    #include <iostream> #include <cstdio> #include <algorithm> #include <vector> using namespace std; int numbers[10]; int length; int n; int permutation(int num[10]){ int i; int oneco=0; for(i=0;i<length;i++){ if(num[i]){oneco++;} } int length2 = length-oneco; if((oneco==length)||(oneco==0)){return 1000000000;} if(abs(length2-oneco)>=2){return 1000000000;} vector<int> one; vector<int> two; for(int i=0;i<length;i++){ if(num[i]){one.push_back(numbers[i]);} else{two.push_back(numbers[i]);} } int len1 = one.size(); int len2 = two.size(); //cout << len1 << len2 << endl; // int num1[10];int num2[10]; vector<int> num1; vector<int> num2; //cout << one[1] << one[2] << endl; int count1=0;int count2 = 0; sort(one.begin(),one.end()); sort(two.begin(),two.end()); do{ int num=0; for(int i=1;i<len1;i++){ int onei = one[i]; for(int i2=0;i2<i;i2++){ onei = onei*10; } num = num + onei; }//cout << num << endl; if(one[0]==0){num = num;} else {num = num + one[0];} num1.push_back(num); //cout << num << endl; count1++; }while(next_permutation(one.begin(),one.end())); do{ int num = 0; for(int i=1;i<len2;i++){ int twoi = two[i]; for(int i2 =0;i2<i;i2++){ twoi = twoi*10; } num = num + twoi; // cout << num << endl; }//cout << "here" << num << endl; if(two[0]==0){num = num;} else {//cout << num ; num = num + two[0]; //cout << " " << num << endl; } num2.push_back(num); //cout << "here" << num << endl; count2++; }while(next_permutation(two.begin(),two.end())); int ans = 1000000000; //cout << len2; int dummy1 = 1; for(int x=1;x<len1;x++){ dummy1 = dummy1*10; }//cout << dummy1; int dummy2 = 1; for(int x=1;x<len2;x++){//cout << dummy2<< endl; dummy2 = (dummy2)*10; //cout << dummy2<< endl; }//cout << dummy2; for(int i=0;i<count1;i++){//cout << num1[i] << dummy1 << endl; if((num1[i]%dummy1)==num1[i]){if(num1[i]!=0){continue;}} for(int i2=0;i2<count2;i2++){ if((num2[i2]%dummy2)==num2[i2]){if(num1[i]!=0){continue;}} ans = min(ans,abs(num1[i]-num2[i2])); } } return ans; } //int permutation(int i[10]){return 1;} int dfs(int i,int num[10]){ if(i==length) return permutation(num); num[i]=0; int ans1 = dfs(i+1,num); num[i]=1; int ans2 = dfs(i+1,num); return min(ans1,ans2); } int main(){ cin >> n; getchar(); for(int i=0;i<n;i++){ /*for(length=0;length<10;length++){ cin >> numbers[length]; char c = getchar(); if(c=='\n'){break;} }*/ string str; while(1){ char c = getchar(); if(c=='\n'){break;} str += c;} length = 0; for(int i2=0;i2<str.length();i2=i2+2){ numbers[length] = (int)str[i2]-'0'; length++; } // cout << length; int dummy[10] = {0,0,0,0,0,0,0,0,0,0}; cout << dfs(1,dummy) << endl; } } 上記のどこが間違っているか教えてください。POJの2718です。書いてあるテストは通りました。

  • C言語 初心者です。

    以下のソースの中でわからないことがあります。 詳しく説明してもらえないでしょうか? よろしくお願いします。 #include <stdio.h> #define NUMBER 80 /* 人数の上限 */ int main(void) { int i,j; int num; int tensu[NUMBER]; int bunpu[11] = {0}; printf("人数を入力してください。:"); do{ scanf("%d",&num); if (num < 0 || num > NUMBER) printf("\a要【1以上%d以下】:", NUMBER); }while (num > 0 || num < NUMBER); puts("点数を入力してください。"); for (i = 0; i < num; i++){ printf("%2d番:", i + 1); do { scanf("%d",&tensu[i]); if (tensu[i] < 0 || tensu[i] > 100) printf("\a要 【0以上100以下】:"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } 上記のソースの中の bunpu[tensu[i] / 10]++; の部分がどうなっているのかわかりません。 教えてください。

  • 配列で最大・最小値を求める

    import java.io.*; class Prog10_2 { public static void main(String args[])throws IOException { System.out.println("10個の整数を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num[] = new int[10]; for(int i=0; i<num.length; i++){ String str = br.readLine(); int tmp = Integer.parseInt(str); num[i] = tmp; } int max = 0; int min = 0; for(int i=0; i<num.length; i++){ if(max < num[i]){ max = num[i]; } if(min > num[i]){ min = num[i]; } } System.out.println("最大値は"+max+"で、最小値は"+min+"です。"); } }   というコマンドを実行すると、最大値はちゃんと表示されるのですが、 最小値はいつも"0"しか表示されません。どこを修正すればいいのでしょうか? どなたか分かる方いらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • Double.parseDoubleの使い方

    Java初心者です。 以下のブログラムをコマンドライン引数が実数の場合に処理できるよう にしたいのですが、うまくいきません。どうしたらいいでしょうか? 申し訳ありませんが、ご回答、よろしくお願いいたします。 public class Narabikae { public static void main(String[] args) { int i = 0, j = 0, k = 0; double[] num = new int[args.length]; for(i = 0; i < args.length; i++) { double num[i] = Double.parseDouble(args[i]); } if (0 < args.length) { for(j = 0; j < args.length-1; j++) { for(i = j + 1; i < args.length; i++ ) { if(num[j] > num[i]) { k = num[j]; num[j] = num[i]; num[i] = k; } } } for(i = 0; i < args.length; i++) { System.out.print(num[i]); if (i != args.length-1) { System.out.print(" ⇒ "); } } } else { System.out.println("並び替えできません。"); } } }

    • ベストアンサー
    • Java
  • 現在学校のjavaの課題電卓を作っています

    import java.io.*; class dentaku { public static void main(String[] args)throws IOException { BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); System.out.print("式を入力"); String input = r.readLine(); String sum[] = new String[input.length()]; String number = ""; int s = 0; int goukei =0; char enzan = ' '; for(int i=0; i < input.length(); i++) { //System.out.print(str[i]); //文字列から1文字ずつ抽出 char num = input.charAt(i); if(i == input.length()-1) { sum[s] = number; } else { if(num == '+' || num == '-'|| num == '*'|| num == '/') { //配列sumに代入 sum[s] = number; s++; sum[s] = String.valueOf(num); s++; } else { //変数numberにnumを代入 number = number + num; } } } for(int j=0; j<sum.length; j++) { if(sum[j] == null) { break; } if(j == 0) { goukei = Integer.parseInt(sum[j]); } else { if(sum[j].equals("+") || sum[j].equals("-")|| sum[j].equals("*")|| sum[j].equals("/")) { enzan = sum[j].charAt(0); } else { switch(enzan) { case '+': goukei += Integer.parseInt(sum[j]); break; case '-': goukei -= Integer.parseInt(sum[j]); break; case '*': goukei *= Integer.parseInt(sum[j]); break; case '/': goukei /= Integer.parseInt(sum[j]); break; } } } } System.out.print(goukei); } } までできたのですが 実行し 実際に 1+1+1とうってみると答えが23になってしまいます。 どのようにしたらいいのでしょうか

    • ベストアンサー
    • Java
  • 数字文字の出現回数を表示するプログラム(C言語)

    タイトルのようなプログラムをCで作ろうとしています。ちなみに初学者です。 たとえば 32356695 と入力すると '0' appeared 0 times. '1' appeared 0 times. '2' appeared 1 times. '3' appeared 2 times. '4' appeared 0 times. '5' appeared 2 times. '6' appeared 2 times. '7' appeared 0 times. '8' appeared 0 times. '9' appeared 1 times. と表示されるようにしたいです。そこで以下のようなプログラムを組みましたが コンパイルは成功するもexeを実行すると数字入力後エラーメッセージが出ます。 ************************************************* #include<stdio.h> #include<string.h> #include<stdlib.h> int main(void) { int i; int count[10]={0}; int length; int digit; char str[100]; printf("Please input number:"); gets(str); length = strlen(str); for(i=0;i<length;i++){ if(str[i]>='0' && str[i]<='9'){ digit = atoi(&str[i]); count[digit]++; } } for(i=0;i<=9;i++){ printf("'%d' appeared %d times.\n",i,count[i]); } return(0); } ****************************************************** よくわからないのですが何故か文字列の長さを収納する変数lengthが1になているようです。 どうかお力添えください。お願いいたします。 コンパイラはbcc32、OSはWindowsXPです。

  • コマンドライン引数を使って2進数を10進数に変換させたい

    2進数を入力し10進数に変換するプログラムを作成したのですが、うまく動作しないので質問させてください。 コマンドライン引数を使って実行したいのですが2進数も入力出来ず困っています。作成したコードの何処に問題があるのかも解らずにいます。 宜しくお願いします。 作成環境は「Windows XP」「Visual Studio .net 2003」 <作成したコードです> *********************************************************** // binary.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include "stdafx.h" #include <stdlib.h> int _tmain(int argc, _TCHAR* argv[]) { if( argc < 8 ){ printf("2進数を入力してください。\n"); exit(1); } //空白文字のチェック// int i=0,n=0; char decimal[ 128 ], binary[ 128 ]; for( i=0; i<argc; i++ ){ if( binary[ i ] != ' ' ){ decimal[ n ] = binary[ i ]; n++; } } //'\0'を代入(文字列の終端)// decimal[ n ]='\0'; //「0」と「1」のループ// for( i=0; i<argc; i++ ){ if(( decimal[ n ] == '0' ) || ( decimal[ n ] == '1' )){ }else{ printf("エラー\n 「0」と「1」以外の文字が入力されております\n"); } } //桁数のループ// int m = 0; for( i=0; i<'\0'; i++ ){ m = m +1 ; } //桁数の判断/// if( m == 8 ){ }else{ printf("エラー\n2進数(0,1)を8桁、入力して下さい。\n"); } //add・初期化// int add = 0; //decimal[0]~decimal[7]の判断// if( decimal[ 0 ] == '1' ){ add += 128; } if( decimal[ 1 ] == '1' ){ add += 64; } if( decimal[ 2 ] == '1' ){ add += 32; } if( decimal[ 3 ] == '1' ){ add += 16; } if( decimal[ 4 ] == '1' ){ add += 8; } if( decimal[ 5 ] == '1' ){ add += 4; } if( decimal[ 6 ] == '1' ){ add += 2; } if( decimal[ 7 ] == '1' ){ add += 1; } //2進数を10進数に変換した値の出力// printf("2進数を10進数に変換した値は %d \n",add); return 0; }

  • 任意の文字列から空白文字の位置を探すには?

    どなたか助けて頂けないでしょうか? 任意の文字列から最初に登場する空白文字の位置を返すプログラムを作りたいのですがうまくいきません。例えば "stream line"という文字列を対象にするとして、 m = "stream line" for i in 0..m.length if m[i] == 32 ; puts i break end end とやって実行すると 6 と返って来てくれるのですが、これをdefで関数にしようとすると失敗してしまいます。自分が組んだのは def findspase(*m) for i in 0..m.length if m[i] == 32 ; puts i break end end end findspase("stream line") のようにしましたが、実行すると何も返ってきません。何がよくないのでしょうか? もし分かる方がいっらしゃいましたら是非ご教授下さい。

    • ベストアンサー
    • Ruby
  • 英語入力するプログラム

    月名の日本語を入力して英語にするプログラムを書こうとしている のですが、うまく動作しません。 たとえば。 「3月:」と表示されたら大文字か小文字、もしくは組み合わせで marchと入力すれば「正解です。」と表示されるようにです。 具体的には、ランダムで月名が表示されていくのですが何を入力しても 正解と表示されてしまいます。 たとえば、marchなのにdなどと入力しても正解になってしまいます。 何がおかしいのでしょうか? #include<stdio.h> #include<time.h> #include<stdlib.h> #include<ctype.h> #include<string.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) char *tukistr[]={"January","Feburary","March","April","May","June","July", "August","September","October","November","December"}; int main(void) { char nstr[12]={0,1,2,3,4,5,6,7,8,9,10,11}; char tuki[10]; int num; int seikai=0; int k=0; int seiho[12]; int huseiho[12]; int m=0; int i,j; srand(time(NULL)); printf("月名の英語を入力してください。入力は大文字でも小文字でも構いません。\n"); for(i=11;i>0;i--) { j=rand()%i; swap(int,nstr[j],nstr[i]); } for(i=0;i<12;i++) { printf("%d月 : ",nstr[i]+1); scanf("%s",tuki); do{ for(j=0;j<strlen(tuki);j++) { if(isalpha(tuki[j])!=isalpha(tukistr[nstr[i]][j])) { printf("違います。正解を見ますか? 0-いいえ/1-はい:"); scanf("%d",&num); if(num==1) { huseiho[m++]=nstr[i]; } break; } } }while(num==0 && j<strlen(tuki)); if(j==strlen(tuki)) { printf("正解です。\n"); seikai++; seiho[k++]=i; } else if(num==1) { printf("%d月は%sです。\n",nstr[i],tukistr[i]); } } printf("12個のうち%d個が正解でした。\n",seikai); printf("正解した月:"); for(j=0;j<12;j++) { if(j==seiho[j]) { printf("%d月,",j+1); } } printf("\n\n"); printf("間違えた月:"); for(j=0;j<12;j++) { if(j==huseiho[j]) { printf("%d月,",j+1); } } return 0; }

  • 教えてください

    このソースのbunpu[tensu[i] / 10]++;がよく分からないので詳しく教えてください。 あと、 printf(" 100:"); for(j=0; j < bunpu[10]; j++) putchar('*'); putchar('\n');についても何を示しているのかわかりません。そこも詳しく教えてください。宜しくお願いします。 #include <stdio.h> #define NUMBER 80 int main(void) { int i, j; int num; int tensu[NUMBER]; int bunpu[11] = {0}; printf("人数を入力してください:"); do{ scanf("%d", &num); if(num < 1 || num > NUMBER) printf("\a要 [1以上%d以下] :", NUMBER); }while (num < 1 || num > NUMBER); puts("点数を入力してください。"); for(i=0; i < num; i++) { printf("%2d番:", i+1); do{ scanf("%d", &tensu[i]); if (tensu[i] < 0 || tensu[i] > 100) printf("\a要 [0以上100以下] :"); }while (tensu[i] < 0 || tensu[i] > 100); bunpu[tensu[i] / 10]++; } puts("\n 分布グラフ "); printf(" 100:"); for(j=0; j < bunpu[10]; j++) putchar('*'); putchar('\n'); for (i=9; i >=0; i--) { printf("%3d-%3d:", i*10, i*10+9); for (j =0; j < bunpu[i]; j++) putchar('*'); putchar('\n'); } return(0); }

専門家に質問してみよう