ページ 1 / 1
文字列長nから4桁以下の2数をとりだす
Posted: 2014年7月12日(土) 02:01
by rozeo
こんばんは、rozeoです。
文字列長nから2数を取り出す方法として、以下のソースをかいています。
(2数は空白で区切られています。、文字列の入力はscanfからの入力ではなくファイルから読み取ったもの)
コード:
int x,y;
x = atoi( str );
if( x >= 1000 ) atoi( &str[5] );
else if( x >= 100 ) atoi( &str[4] );
else if( x >= 10 ) atoi( &str[3] );
else atoi( &str[2] );
という方法で2つの数を取り出して、いたんですが、正直汚いです。
もう少しコンパクトにかけないのかなぁと思いいろいろしらべてみましたが、なかなかみつかりません。
なにかもう少しコンパクトにかける方法はありませんでしょうか?
回答お待ちしておまります。
Re: 文字列長nから4桁以下の2数をとりだす
Posted: 2014年7月12日(土) 03:22
by かずま
rozeo さんが書きました:
文字列長nから2数を取り出す方法として、以下のソースをかいています。
「文字列長 n」の意味がよくわかりませんが、
sscanf(str, "%d%d", &x, &y) ではダメなんですか?
コード:
#include <stdio.h>
void atoi2(const char *str)
{
int x, y;
if (sscanf(str, "%d%d", &x, &y) == 2)
printf("x = %d, y = %d\n", x, y);
else
puts("error");
}
int main(void)
{
atoi2("1234 5678");
atoi2("73 5");
atoi2("271 abc");
return 0;
}
Re: 文字列長nから4桁以下の2数をとりだす
Posted: 2014年7月12日(土) 08:40
by みけCAT
sscanfを使うべきだとは思いますが、提示されたコードを改善してみました。
コード:
int x,y;
int xx,yy;
x=atoi(str);
for(xx=10,yy=2;x>=xx;xx*=10,yy++);
atoi(&str[yy]);
Re: 文字列長nから4桁以下の2数をとりだす
Posted: 2014年7月12日(土) 10:31
by かずま
sscanf を使わないなら
コード:
char *p;
x = strtol(str, &p, 10);
y = atoi(p);
Re: 文字列長nから4桁以下の2数をとりだす
Posted: 2014年7月12日(土) 22:19
by rozeo
かずま さんが書きました:rozeo さんが書きました:
文字列長nから2数を取り出す方法として、以下のソースをかいています。
「文字列長 n」の意味がよくわかりませんが、
sscanf(str, "%d%d", &x, &y) ではダメなんですか?
コード:
#include <stdio.h>
void atoi2(const char *str)
{
int x, y;
if (sscanf(str, "%d%d", &x, &y) == 2)
printf("x = %d, y = %d\n", x, y);
else
puts("error");
}
int main(void)
{
atoi2("1234 5678");
atoi2("73 5");
atoi2("271 abc");
return 0;
}
sscanfについて調べてみましたがこんな関数があることを初めて知りました。
>>みけCATさん
修正ありがとうございます。
工夫次第でsscanfのような関数をつかわずatoiのみでできるとは知りませんでした。
回答ありがとうございます。以上で解決とさせていただきます。
Re: 文字列長nから4桁以下の2数をとりだす
Posted: 2014年7月12日(土) 22:19
by rozeo
かずま さんが書きました:rozeo さんが書きました:
文字列長nから2数を取り出す方法として、以下のソースをかいています。
「文字列長 n」の意味がよくわかりませんが、
sscanf(str, "%d%d", &x, &y) ではダメなんですか?
コード:
#include <stdio.h>
void atoi2(const char *str)
{
int x, y;
if (sscanf(str, "%d%d", &x, &y) == 2)
printf("x = %d, y = %d\n", x, y);
else
puts("error");
}
int main(void)
{
atoi2("1234 5678");
atoi2("73 5");
atoi2("271 abc");
return 0;
}
sscanfについて調べてみましたがこんな関数があることを初めて知りました。
>>みけCATさん
修正ありがとうございます。
工夫次第でsscanfのような関数をつかわずatoiのみでできるとは知りませんでした。
回答ありがとうございます。以上で解決とさせていただきます。
Re: 文字列長nから4桁以下の2数をとりだす
Posted: 2014年7月12日(土) 22:20
by rozeo
なぜか2重投稿になりました。すいません。
Re: 文字列長nから4桁以下の2数をとりだす
Posted: 2014年7月12日(土) 22:54
by へにっくす
rozeo さんが書きました:なぜか2重投稿になりました。すいません。
一つを消せばいいんでは・・・