C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

動的配列の文字列型から整数型に変換

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■91091 / inTopicNo.1)  動的配列の文字列型から整数型に変換
  
□投稿者/ しー (7回)-(2019/05/28(Tue) 15:45:22)

分類:[C/C++] 

文字列型と整数型の動的配列(Vector)間で変換したいとき

for (int i = 0; i < question_I.size(); i++) {
 question_I[i] = atoi(question_S[i].c_str());
}

という記述では変換できませんか?
引用返信 編集キー/
■91092 / inTopicNo.2)  Re[1]: 動的配列の文字列型から整数型に変換
□投稿者/ 774RR (691回)-(2019/05/28(Tue) 16:20:48)
型が何も書かれていないけど何となく妄想するにそれで行けるかも。
当然だが事前に vector の次元数は合わせてあるんだよね?

std::stoi を使うほうがよさそうな気がする (C++11 以後のみ限定)

引用返信 編集キー/
■91093 / inTopicNo.3)  Re[2]: 動的配列の文字列型から整数型に変換
□投稿者/ とっちゃん (591回)-(2019/05/28(Tue) 16:28:48)
ループ開始前に

question_I.resize( question_S.size() );

があれば行けると思う。型がわからないから、妄想レベルなのは変わらないけど。

引用返信 編集キー/
■91095 / inTopicNo.4)  Re[3]: 動的配列の文字列型から整数型に変換
□投稿者/ しー (8回)-(2019/05/28(Tue) 17:17:50)
このように宣言をし、
vector <string> question_S;
vector <vector<int>> question_I(10, vector<int>(1,0));

質問で記述したコードの前に次のような処理を入れるつもりです。

@ 標準入力したものをstring型変数に格納する。
A @で受け取った文字列をgetline関数で区切る。
B question_Sにpush_backでAで区切ったものを格納していく。
C question_Iの要素数とメモリ確保量を、question_Sに合わせるために以下の処理をする。

if (question_I.capacity < question_S.size()) {
question_I.reserve(question_S.size());
question_I.resize(question_S.size());
}
else if(question_I.capacity > question_S.size()) {
question_I.resize(question_S.size());
question_I.shrink_to_fit();
}


という形ではだめでしょうか?
すごく効率悪そうな気がしないでもないですが…。

入力方法を、"1,2,3,4,5,6"という形で入れてもらう以上、この方法しか思い浮かびませんでした。

引用返信 編集キー/
■91096 / inTopicNo.5)  Re[4]: 動的配列の文字列型から整数型に変換
□投稿者/ とっちゃん (593回)-(2019/05/28(Tue) 19:10:30)
No91095 (しー さん) に返信
> このように宣言をし、
> vector <string> question_S;
> vector <vector<int>> question_I(10, vector<int>(1,0));
>
> 質問で記述したコードの前に次のような処理を入れるつもりです。
>
> @ 標準入力したものをstring型変数に格納する。
> A @で受け取った文字列をgetline関数で区切る。
> B question_Sにpush_backでAで区切ったものを格納していく。
> C question_Iの要素数とメモリ確保量を、question_Sに合わせるために以下の処理をする。
>

データとしては

1,2,3
4,5,6
7,8,9

というような感じのデータを標準入力から受け取るということですかね?

CSVのパースと同じですが、vector<行データを表現するオブジェクト> という形を検討するのがいいと思いますよ。

絶対に整数値しか来ないなら、
std::vetor<std::vector<int>> question;
で、保持するようにする形でいいと思いますし、
何が来るかわからないような場合は
std::vector<std::vector<std::string>> question;
としておけば無難だと思います。

部分的なコードだとこんな感じかな?(整数値のみという前提)

std::vetor<std::vector<int>> question; // 元の question_I に当たるもの。
std::string lineStr;
while( std::getline( std::cin, lineStr ) )
{
// ここで、lineStr を区切り文字で、切り出しながら、question に追加していく処理を書きます。
// C++ には、区切り文字で分解して配列にするみたいな便利なクラスはありません。
}

引用返信 編集キー/
■91097 / inTopicNo.6)  Re[5]: 動的配列の文字列型から整数型に変換
□投稿者/ しー (9回)-(2019/05/28(Tue) 22:57:45)
2019/05/28(Tue) 17:17:50 に投稿させていただいた方法でやりますと

question_I[i] = atoi(question_S[i].c_str()); の部分で

エラー C2679
二項演算子 '=': 型 'int' の右オペランドを扱う演算子が見つかりません (または変換できません)。

というエラーが出ましたこと、ご報告させていただきます。
引用返信 編集キー/
■91099 / inTopicNo.7)  Re[4]: 動的配列の文字列型から整数型に変換
□投稿者/ とっちゃん (594回)-(2019/05/29(Wed) 10:02:51)
No91097 (しー さん) に返信
> 2019/05/28(Tue) 17:17:50 に投稿させていただいた方法でやりますと
>
> question_I[i] = atoi(question_S[i].c_str()); の部分で
>
> エラー C2679
> 二項演算子 '=': 型 'int' の右オペランドを扱う演算子が見つかりません (または変換できません)。
>
> というエラーが出ましたこと、ご報告させていただきます。

このエラーは、
「'operator=( int )' に相当するものがないので、コンパイルできません。」
という意味のことを言っています。

もう少しわかりやすく言うと
「qustion_I[i] には、atoi() の結果を代入することができません。」
ということと同意です。

question_I[i] の型が何かを今一度よく考えてみましょう。

引用返信 編集キー/
■91107 / inTopicNo.8)  Re[5]: 動的配列の文字列型から整数型に変換
□投稿者/ しー (10回)-(2019/05/29(Wed) 15:27:18)
> question_I[i] の型が何かを今一度よく考えてみましょう。

右辺は、atoiで文字型を整数型に変換するので、整数型(int)となるかと思います。
atoi(question_S[i].c_str());

左辺は、以下のようにint型で宣言しているので、整数型(int)という認識でいます。
vector <vector<int>> question_I(10, vector<int>(1,0));


右辺(整数型) = 左辺(整数型) が成り立つと思ったのですが違うのでしょうか。
確かに、 int question_I[100]; とすると通るのでvectorの使い方に問題があるのですね…。
引用返信 編集キー/
■91109 / inTopicNo.9)  Re[6]: 動的配列の文字列型から整数型に変換
□投稿者/ Hongliang (809回)-(2019/05/29(Wed) 15:39:19)
> 左辺は、以下のようにint型で宣言しているので、整数型(int)という認識でいます。
> vector <vector<int>> question_I(10, vector<int>(1,0));

question_I は vector<vector<int>> 型。
question_I[x] は vector<int> 型。
question_I[x][y] は int 型。

こういう話の前に、一旦要件を整理された方が良いように思います。

どういう入力なのか。
カンマ区切り数字というのは出ていますが、列数は固定なのか可変なのか。
行数は1行なのか複数行なのか、複数行なら行数は固定なのか可変なのか。
複数行の場合、行ごとの列数は同じなのか異なるのか、というのも。

入力から作られたintの動的配列を使ってどういうことをしたいのか。
引用返信 編集キー/
■91113 / inTopicNo.10)  Re[6]: 動的配列の文字列型から整数型に変換
□投稿者/ とっちゃん (595回)-(2019/05/29(Wed) 16:51:03)
No91107 (しー さん) に返信
>>question_I[i] の型が何かを今一度よく考えてみましょう。
>
> 右辺は、atoiで文字型を整数型に変換するので、整数型(int)となるかと思います。
> atoi(question_S[i].c_str());
>
question_S[i] に格納されている文字列がどんなものかわかりませんが、atoi した結果は
int 型の値が返ってきますね。


> 左辺は、以下のようにint型で宣言しているので、整数型(int)という認識でいます。
> vector <vector<int>> question_I(10, vector<int>(1,0));
>
vector<T> v; という方の場合、v[i] は、 T型になります。
なので、ここでは、question_I[i] は、vector<int> 型になります。
意図した型ですか?

意図した型であるとすれば、それは、question_I[i] へ代入するときの値の作り方が問題となります。

>
> 右辺(整数型) = 左辺(整数型) が成り立つと思ったのですが違うのでしょうか。
> 確かに、 int question_I[100]; とすると通るのでvectorの使い方に問題があるのですね…。

通常の配列のように書くと、今回の記述は
vector<int> question_I[100]; と書いているのと同じです。
意図した定義ですか?

最初に戻って。。。

atoi( question_S[i].c_str() ) (C++ で書くなら、std::stoi( question_S[i] ) と書いても同様の結果になる)

と呼び出しています。

戻り値はどのような値を期待していますか?

それは、atoi で実現できるものですか?そうではないものですか?

atoi はどんな値を受け取りどんな値を返すのかを今一度よく調べてみることをお勧めします。
そのうえで、自分がやりたいことは単に atoi を呼べばいいのかを考えてみてください。

引用返信 編集キー/
■91116 / inTopicNo.11)  Re[7]: 動的配列の文字列型から整数型に変換
□投稿者/ しー (11回)-(2019/05/29(Wed) 21:36:19)
2019/05/29(Wed) 21:37:14 編集(投稿者)

> 戻り値はどのような値を期待していますか?
> それは、atoi で実現できるものですか?そうではないものですか?

戻り値は整数型(int型)を期待しています。
したがって、実現できるものです。



> atoi はどんな値を受け取りどんな値を返すのかを今一度よく調べてみることをお勧めします。

stoiの場合は、文字列型(string型)を受け取り、整数型(int型)で返すことができます。
http://kaworu.jpn.org/cpp/std::stoi

atoiの場合は、文字型(char型)を受け取り、整数型(int型)で返すことができます。

よって、問題はないかと存じます。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
余談ですが、atoiやstoi、型、vectorに問題はありませんでした。
私のケアレスミスでした。お騒がせして申し訳ありません。


 vector <vector<int>> question_I(10, vector<int>(1,0));

2次元配列で定義していますので、正しくは次にようにする必要がありました。

 question_I[i][0] = atoi(question_S[i].c_str());
解決済み
引用返信 編集キー/
■91118 / inTopicNo.12)  Re[8]: 動的配列の文字列型から整数型に変換
□投稿者/ とっちゃん (596回)-(2019/05/30(Thu) 11:15:49)
No91116 (しー さん) に返信
解決済みになっているので維持。

>  vector <vector<int>> question_I(10, vector<int>(1,0));
>
> 2次元配列で定義していますので、正しくは次にようにする必要がありました。
>
>  question_I[i][0] = atoi(question_S[i].c_str());

question_S[i] の内容が "1,2,3" のような文字列の場合
atoi や stoi では、意図した数値は得られません(先頭だけ利用される)。

もし、文字列と1対1で変換すればいいのであれば、question_I の型を
std::vector<int> question_I; とすれば、
どちらも一次元配列のように使うことができます。


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ