文字の途中の数字を表示させたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KTN19
記事: 23
登録日時: 9年前

文字の途中の数字を表示させたい

#1

投稿記事 by KTN19 » 9年前

入力する文字の長さと数字の数を数えるプログラムを書いているのですが,上手くいきません.
例の通りになれば成功なのですが、、、


123 → 長さ 3,数字 3 個
prog  → 長さ 4,数字 0 個
December 24th is Christmas Eve. → 長さ 31,数字 2個

コード:

#include<stdio.h>
#include<ctype.h>

int str_length( char s[] );
int str_num_count( char s[] );
void get_line( char str[] , int size );


int main( void )
{
	char length[ 100 ];
	char a;
	int i, j;
	
	printf( " 入力せよ>>" );
	get_line( length, 100 );
	i = str_length( length );
	j = str_num_count( length );
	
	printf( "長さ %d, 数字 %d \n", i, j );
	
	return 0;
}
void get_line( char str[], int size )
{
	int i, c;
	
	for( i = 0; i < size-1; i++ )
	{
		c = getchar();
		if( c == EOF || c == '\n' ) break;
		str[ i ] = c;
	}
	str[ i ] = '\0';
	
}

int str_length( char s[] )
{
	int i;
	
	for( i = 0; s[ i ] != '\0'; i++ ) ;
	
	return i;
}

int str_num_count( char s[] )
{
	int j;
	for( j = 0; isdigit( s[ j ] ) != '\0'; j++ )
	{
		;
		
	}
	
	return j;
}


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字の途中の数字を表示させたい

#2

投稿記事 by みけCAT » 9年前

KTN19 さんが書きました:入力する文字の長さと数字の数を数えるプログラムを書いているのですが,上手くいきません.
確かに0文字以上99文字以下の半角数字だけの入力以外に対しては上手くいかなそうなプログラムですね。
半角数字だけの入力に対しても、「個」が出力されず上手くいかなそうですね。
何か質問はありますか?
オフトピック
例の通りになれば成功 (例の通りにならなければ失敗とは言ってない)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

KTN19
記事: 23
登録日時: 9年前

Re: 文字の途中の数字を表示させたい

#3

投稿記事 by KTN19 » 9年前

入力は半角英数字だけで良いです.英字の次に数字が来るとして,それを表示させるにはどのように書き換えれば良いでしょうか?

box
記事: 2002
登録日時: 14年前

Re: 文字の途中の数字を表示させたい

#4

投稿記事 by box » 9年前

こんな感じ?馬鹿げたコードですけど。

コード:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define N (128)

int getNumOfDigit(char *str)
{
    int digit, i;

    for (digit = i = 0; str[i]; i++) {
        if (isdigit(str[i])) digit++;
    }
    return digit;
}

int main(void)
{
    char str[N];

    fgets(str, N, stdin);
    str[strlen(str) - 1] = '\0';
    printf("長さ %d, 数字%d個\n", strlen(str), getNumOfDigit(str));
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 14年前

Re: 文字の途中の数字を表示させたい

#5

投稿記事 by box » 9年前

ついでだから別の言語で書いてみた。

コード:

def integer_string?(s)
  Integer(s)
  true
rescue ArgumentError
  false
end

def getNumOfDigit(s)
  count = 0
  s.length.times do |i|
    count += 1 if integer_string?(s[i])
  end
  count
end

s = STDIN.gets.chomp
printf "length=%d, digit=%d\n", s.length, getNumOfDigit(s)
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: 文字の途中の数字を表示させたい

#6

投稿記事 by かずま » 9年前

スクリプト言語は、C に比べて文字列の処理が得意ですね。

コード:

s = gets.chomp
printf "length=%d, digits=%d\n", s.length, s.scan(/[0-9]/).size

KTN19
記事: 23
登録日時: 9年前

Re: 文字の途中の数字を表示させたい

#7

投稿記事 by KTN19 » 9年前

box さんが書きました:

コード:


int getNumOfDigit(char *str)
{
    int digit, i;

    for (digit = i = 0; str[i]; i++) {
        if (isdigit(str[i])) digit++;
    }
    return digit;
}

質問ですが,ループの継続条件のstrはどういう意味があるのですか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 文字の途中の数字を表示させたい

#8

投稿記事 by みけCAT » 9年前

KTN19 さんが書きました:質問ですが,ループの継続条件のstrはどういう意味があるのですか?

strが先頭要素を指す配列のi番目の要素が0、すなわちヌル文字でない間、という意味でしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 文字の途中の数字を表示させたい

#9

投稿記事 by かずま » 9年前

難しく考えなくても、いいのでは?

コード:

#include <stdio.h>   // printf, getchar, 
#include <ctype.h>   // isdigit
 
int main(void)
{
    int c, n_char = 0, n_digit = 0;

    printf("入力せよ>>");
    while ((c = getchar()) != EOF && c != '\n') {
        n_char++;
        if (isdigit(c)) n_digit++;
    }
    printf("長さ %d, 数字 %d個\n", n_char, n_digit);
    return 0;
}
getchar() は、unsigned char の範囲の値と EOF を返しますから、
isdigit() にそのまま渡せます。

KTN19
記事: 23
登録日時: 9年前

Re: 文字の途中の数字を表示させたい

#10

投稿記事 by KTN19 » 9年前

くどい書き方かもしれませんが,上手く作用しました!
ご教授ありがとうございます.

コード:

#include<stdio.h>
#include<ctype.h>

int str_length( char s[] );
int str_num_count( char s[] );
void get_line( char str[] , int size );


int main( void )
{
	char length[ 100 ];
	char a;
	int i, j;
	
	printf( " 入力せよ>>" );
	get_line( length, 100 );
	i = str_length( length );
	j = str_num_count( length );
	
	printf( "長さ %d, 数字 %d \n", i, j );
	
	return 0;
}
void get_line( char str[], int size )
{
	int i, c;
	
	for( i = 0; i < size-1; i++ )
	{
		c = getchar();
		if( c == EOF || c == '\n' ) break;
		str[ i ] = c;
	}
	str[ i ] = '\0';
	
}

int str_length( char s[] )
{
	int i;
	
	for( i = 0; s[ i ] != '\0'; i++ ) ;
	
	return i;
}

int str_num_count( char s[] )
{
	int j, digit;
	for( digit = j = 0; s[ j ]; j++ )
	{
		if( isdigit( s[ j ] ) )digit++;
	}
	
	return digit;
}

閉鎖

“C言語何でも質問掲示板” へ戻る