質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • C++

    3245questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

数字の文字列を一桁ずつ数字として取り出す方法

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 945

l_h_l_h

score 4

任意の数字列が文字列型として与えられたときに、それらの数字を整数型に変換して、一つずつ取り出したいのですが、その方法が分かりません

例えば、123456789という文字列がstring型で与えられたとき、それをint型の配列に1桁ずつ代入していきたいです

char* cstr = new char[str.size() + 1];
std::char_traits<char>::copy(cstr, str.c_str(), str.size() + 1);


というコードを使い、stringからcharに変換することはできたのですが、そのあとの処理が分かりませんでした
単純にatoi(cstr)とすると意味不明な数字列が出力されますし、一桁ずつ分解することもできませんでした
御助力願います

--追記--
皆さまご回答ありがとうございます
とても助かります
重ね重ね申し訳ないのですが、vectorを使わない方法もございますでしょうか
以前、isdigitやatoiを使えばC言語でもできると聞いたことがあったのですが、どうしてもその方法が思いつきません(試行結果は上述の通りで、char型に変換したところで終わっています)
もしよろしければそちらもご教授願いたいと思います
よろしくお願いいたします

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+5

vector<int>に一文字ずつ押し込むのが簡単かと。

for(auto ch: str) {
    vec.emplace_back(ch - '0');
}

追記を受けて

重ね重ね申し訳ないのですが、vectorを使わない方法もございますでしょうか

こんな感じでしょうか。
『C流』のコードと、『C++流』のコードは積極的に混ぜる物ではないと思います。
その意図も込めて、下記コードでは std::string の利用は避けています。

char str[] = "123456789";
size_t len = strlen(str);

int* dst = malloc(sizeof(int) * len);
if(!dst) {
    exit(1);
}

for(size_t i = 0; i < len; ++i) {
    dst[i] = str[i] - '0';
}

// 色んな処理

free(dst);

VLAなんてものもありますが、ここではmallocを使う方法にしてみました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 23:11

    回答ありがとうございます!
    無事解決することが出来ました!

    キャンセル

+3

やり方はいろいろあると思うのよ...

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
  string str = "123456789"; // 数字列
  vector<int> nums(str.size()); // 同じ長さのint列

  // char -> int 変換
  transform(str.begin(), str.end(), nums.begin(), [](char ch) { return ch - '0';});

  // 確認
  for ( int item : nums ) cout << item << ' ';
  return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

重ね重ね申し訳ないのですが、vectorを使わない方法もございますでしょうか

最終的にint配列が欲しいなら、vector<int> から手に入ります。

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
  string str = "123456789"; // 数字列
  vector<int> nums(str.size()); // 同じ長さのint列

  // char -> int 変換
  transform(str.begin(), str.end(), nums.begin(), [](char ch) { return ch - '0';});

  const int* result = nums.data(); // int列の先頭 と
  const size_t size = nums.size(); // 列の長さ

  // 確認
  for ( size_t i = 0; i < size; ++i ) cout << result[i] << ' ';
  return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

isdigitやatoiを使う方法

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main(){
  const char* str = "123987";
  int size = 0;
  int* n = malloc(sizeof(int) * strlen(str));
  char b[2] = {0};
  for(int i = 0; isdigit(str[i]); i++){
    b[0] = str[i];
    n[size++] = atoi(b);
  }
  for(int i = 0; i < size; i++){
    printf("%d => %d\n", i, n[i]);
  }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 23:10

    回答ありがとうございました!
    無事解決できました!

    キャンセル

checkベストアンサー

+1

isdigitやatoiを使えばC言語でもできると聞いたことがあったのですが

#include <iostream>
#include <string>
#include <cstdlib> // atoi
#include <cctype> // isdigit
using namespace std;

int main() {
  string str = "12T456S890"; // 数字列

  // char -> int 変換 (数字でなかったら -1)
  for ( char ch : str ) {
    int number = isdigit(ch) ? atoi(string(1,ch).c_str()) : -1;
    cout << ch << " : " << number << endl;
  }
}

/* 実行結果
1 : 1
2 : 2
T : -1
4 : 4
5 : 5
6 : 6
S : -1
8 : 8
9 : 9
0 : 0
*/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 23:10

    何度も有難うございます
    無事できました

    キャンセル

+1

一桁だけなら、

char str[]="123456789";
int i=3;

int suji=str[i]-'0';

// suji==4

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/17 23:10

    回答ありがとうございました!
    助かりました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3245questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。