文字列長nから4桁以下の2数をとりだす

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
rozeo
記事: 86
登録日時: 10年前
住所: 広島 呉 (学生寮
連絡を取る:

文字列長nから4桁以下の2数をとりだす

#1

投稿記事 by rozeo » 9年前

こんばんは、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数をとりだす

#2

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

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

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

Re: 文字列長nから4桁以下の2数をとりだす

#3

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

sscanfを使うべきだとは思いますが、提示されたコードを改善してみました。

コード:

int x,y;
int xx,yy;
x=atoi(str);
for(xx=10,yy=2;x>=xx;xx*=10,yy++);
atoi(&str[yy]);
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 文字列長nから4桁以下の2数をとりだす

#4

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

sscanf を使わないなら

コード:

char *p;
x = strtol(str, &p, 10);
y = atoi(p);

rozeo
記事: 86
登録日時: 10年前
住所: 広島 呉 (学生寮
連絡を取る:

Re: 文字列長nから4桁以下の2数をとりだす

#5

投稿記事 by rozeo » 9年前

かずま さんが書きました:
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のみでできるとは知りませんでした。

回答ありがとうございます。以上で解決とさせていただきます。

rozeo
記事: 86
登録日時: 10年前
住所: 広島 呉 (学生寮
連絡を取る:

Re: 文字列長nから4桁以下の2数をとりだす

#6

投稿記事 by rozeo » 9年前

かずま さんが書きました:
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のみでできるとは知りませんでした。

回答ありがとうございます。以上で解決とさせていただきます。

rozeo
記事: 86
登録日時: 10年前
住所: 広島 呉 (学生寮
連絡を取る:

Re: 文字列長nから4桁以下の2数をとりだす

#7

投稿記事 by rozeo » 9年前

なぜか2重投稿になりました。すいません。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: 文字列長nから4桁以下の2数をとりだす

#8

投稿記事 by へにっくす » 9年前

rozeo さんが書きました:なぜか2重投稿になりました。すいません。
一つを消せばいいんでは・・・
written by へにっくす

閉鎖

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