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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

6回答

4148閲覧

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

l_h_l_h

総合スコア22

C++

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

0グッド

0クリップ

投稿2018/04/14 10:51

編集2018/04/15 16:09

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

例えば、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型に変換したところで終わっています)
もしよろしければそちらもご教授願いたいと思います
よろしくお願いいたします

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

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

C++

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

追記を受けて

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

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

C

1char str[] = "123456789"; 2size_t len = strlen(str); 3 4int* dst = malloc(sizeof(int) * len); 5if(!dst) { 6 exit(1); 7} 8 9for(size_t i = 0; i < len; ++i) { 10 dst[i] = str[i] - '0'; 11} 12 13// 色んな処理 14 15free(dst);

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

投稿2018/04/14 10:58

編集2018/04/15 16:22
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

l_h_l_h

2018/04/17 14:11

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

0

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

C++

1#include <iostream> 2#include <string> 3#include <vector> 4#include <algorithm> 5using namespace std; 6 7int main() { 8 string str = "123456789"; // 数字列 9 vector<int> nums(str.size()); // 同じ長さのint列 10 11 // char -> int 変換 12 transform(str.begin(), str.end(), nums.begin(), [](char ch) { return ch - '0';}); 13 14 // 確認 15 for ( int item : nums ) cout << item << ' '; 16 return 0; 17}

投稿2018/04/14 13:54

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

一桁だけなら、

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

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

// suji==4

投稿2018/04/15 22:12

編集2018/04/15 22:13
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

l_h_l_h

2018/04/17 14:10

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

0

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/15 22:04

編集2018/04/15 22:12
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

l_h_l_h

2018/04/17 14:10

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

0

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

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

C++

1#include <iostream> 2#include <string> 3#include <vector> 4#include <algorithm> 5using namespace std; 6 7int main() { 8 string str = "123456789"; // 数字列 9 vector<int> nums(str.size()); // 同じ長さのint列 10 11 // char -> int 変換 12 transform(str.begin(), str.end(), nums.begin(), [](char ch) { return ch - '0';}); 13 14 const int* result = nums.data(); // int列の先頭 と 15 const size_t size = nums.size(); // 列の長さ 16 17 // 確認 18 for ( size_t i = 0; i < size; ++i ) cout << result[i] << ' '; 19 return 0; 20}

投稿2018/04/15 20:12

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

C++

1#include <iostream> 2#include <string> 3#include <cstdlib> // atoi 4#include <cctype> // isdigit 5using namespace std; 6 7int main() { 8 string str = "12T456S890"; // 数字列 9 10 // char -> int 変換 (数字でなかったら -1) 11 for ( char ch : str ) { 12 int number = isdigit(ch) ? atoi(string(1,ch).c_str()) : -1; 13 cout << ch << " : " << number << endl; 14 } 15} 16 17/* 実行結果 181 : 1 192 : 2 20T : -1 214 : 4 225 : 5 236 : 6 24S : -1 258 : 8 269 : 9 270 : 0 28*/

投稿2018/04/16 00:13

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

l_h_l_h

2018/04/17 14:10

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問