ページ 11

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

Posted: 2015年12月18日(金) 19:42
by KTN19
入力する文字の長さと数字の数を数えるプログラムを書いているのですが,上手くいきません.
例の通りになれば成功なのですが、、、


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;
}


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

Posted: 2015年12月18日(金) 20:39
by みけCAT
KTN19 さんが書きました:入力する文字の長さと数字の数を数えるプログラムを書いているのですが,上手くいきません.
確かに0文字以上99文字以下の半角数字だけの入力以外に対しては上手くいかなそうなプログラムですね。
半角数字だけの入力に対しても、「個」が出力されず上手くいかなそうですね。
何か質問はありますか?
オフトピック
例の通りになれば成功 (例の通りにならなければ失敗とは言ってない)

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

Posted: 2015年12月18日(金) 21:45
by KTN19
入力は半角英数字だけで良いです.英字の次に数字が来るとして,それを表示させるにはどのように書き換えれば良いでしょうか?

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

Posted: 2015年12月18日(金) 23:39
by box
こんな感じ?馬鹿げたコードですけど。

コード:

#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;
}

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

Posted: 2015年12月19日(土) 00:46
by box
ついでだから別の言語で書いてみた。

コード:

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: 文字の途中の数字を表示させたい

Posted: 2015年12月19日(土) 11:22
by かずま
スクリプト言語は、C に比べて文字列の処理が得意ですね。

コード:

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

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

Posted: 2015年12月19日(土) 20:57
by KTN19
box さんが書きました:

コード:


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

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

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

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

Posted: 2015年12月19日(土) 21:45
by みけCAT
KTN19 さんが書きました:質問ですが,ループの継続条件のstrはどういう意味があるのですか?

strが先頭要素を指す配列のi番目の要素が0、すなわちヌル文字でない間、という意味でしょう。

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

Posted: 2015年12月19日(土) 22:11
by かずま
難しく考えなくても、いいのでは?

コード:

#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() にそのまま渡せます。

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

Posted: 2015年12月19日(土) 22:45
by KTN19
くどい書き方かもしれませんが,上手く作用しました!
ご教授ありがとうございます.

コード:

#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;
}