コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
例)
111 2222 33
を
111
2222
33
のようにしたいです。
で配列に入れて、簡単にアクセス出来るようになりたいです。
=================ここから==============================
#include <stdio.h>
#include <windows.h>
int main(void){
wchar_t buf[1024];
int nNumArgs,i;
gets(buf);
PWSTR *ppArgv = CommandLineToArgvW(buf,&nNumArgs);
for(i;i<nNumArgs;i++){
printf("%s\n",(char)*ppArgv[0]);
}
return 0;
}
=============ここまで======================================
ところがこんなエラーが出てきます。
エラー E2034 divcmdl.cpp 10: 'wchar_t *' 型は 'char *' 型に変換できない(関数 main() )
エラー E2342 divcmdl.cpp 10: パラメータ '__s' は char * 型として定義されているので wchar_t * は渡せない(関数 main() )
エラー E2034 divcmdl.cpp 13: 'wchar_t *' 型は 'char' 型に変換できない(関数 main() )
CommandLineToArgvW()がUnicode版なのでまずいのでしょうか・・・
何別の方法があるのでしょうか・・・?
コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
Re:コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
C++のようですが、それなら...
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<std::string> v;
std::string buffer;
std::getline(std::cin, buffer);
std::istringstream iss(buffer);
std::copy(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter(v));
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
これでよくないですか?
配列ではなくvectorですが、やりたいことはこれでできるはずです。
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<std::string> v;
std::string buffer;
std::getline(std::cin, buffer);
std::istringstream iss(buffer);
std::copy(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter(v));
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
これでよくないですか?
配列ではなくvectorですが、やりたいことはこれでできるはずです。
Re:コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
素早いご回答ありがとうございます!
C++は使ったことがないので勉強してみようとおもいます・・・
難しいですね・・・
関数にして、変換前の文字列へのポインタ、配列の数へのポインタをもらい、
変換後の文字列の配列を戻り値にするような関数を作りたかったのです。
C++だと関数は使えないのでしょうか・・・・?
C++は使ったことがないので勉強してみようとおもいます・・・
難しいですね・・・
関数にして、変換前の文字列へのポインタ、配列の数へのポインタをもらい、
変換後の文字列の配列を戻り値にするような関数を作りたかったのです。
C++だと関数は使えないのでしょうか・・・・?
Re:コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
> C++は使ったことがないので
いや、C++を使っていると思いますよ。
> 関数にして、変換前の文字列へのポインタ、配列の数へのポインタをもらい、
> 変換後の文字列の配列を戻り値にするような関数を作りたかったのです。
↓でよいのでは?
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
std::vector<std::string> split(const std::string* s, std::size_t* n = 0)
{
std::istringstream iss(*s);
std::vector<std::string> v;
std::copy(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter(v));
if (n != 0)
*n = v.size();
return v;
}
int main()
{
std::string buffer;
std::getline(std::cin, buffer);
std::vector<std::string> v = split(&buffer);
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
> C++だと関数は使えないのでしょうか・・・・?
そんなことはありません。
いや、C++を使っていると思いますよ。
> 関数にして、変換前の文字列へのポインタ、配列の数へのポインタをもらい、
> 変換後の文字列の配列を戻り値にするような関数を作りたかったのです。
↓でよいのでは?
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
std::vector<std::string> split(const std::string* s, std::size_t* n = 0)
{
std::istringstream iss(*s);
std::vector<std::string> v;
std::copy(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter(v));
if (n != 0)
*n = v.size();
return v;
}
int main()
{
std::string buffer;
std::getline(std::cin, buffer);
std::vector<std::string> v = split(&buffer);
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
> C++だと関数は使えないのでしょうか・・・・?
そんなことはありません。
Re:コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
PWSTR split(char buf, int *n)のようにchar型の文字列を配列に
変えて戻り値にして、配列の個数をint型で渡したかったのですが、
うまくいきませんでした。もう少し勉強してみます。
変えて戻り値にして、配列の個数をint型で渡したかったのですが、
うまくいきませんでした。もう少し勉強してみます。
Re:コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
以下のようなコードが
エラーに成ります・・・・
どこが良くなかったのでしょう…?
エラー E2034 divcmdl.cpp 11: 'int' 型は 'char *' 型に変換できない(関数 CmdTok(ch
ar *,char *,int,char *) )
エラー E2342 divcmdl.cpp 11: パラメータ '__s1' は char * 型として定義されている
ので char は渡せない(関数 CmdTok(char *,char *,int,char *) )
エラー E2034 divcmdl.cpp 11: 'char *' 型は 'char' 型に変換できない(関数 CmdTok(c
har *,char *,int,char *) )
エラー E2034 divcmdl.cpp 12: 'char *' 型は 'char' 型に変換できない(関数 CmdTok(c
har *,char *,int,char *) )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//buf コマンドライン、div 区切り文字、n 何番目かのコマンドライン、 ret 切り出されたコマンドライン
int CmdTok(char *buf ,char *div,int n ,char *ret){
int i;
*ret = strtok(buf,div);
for(i=0;i<n-1;i++) *ret = strtok(NULL,div);
return 0;
}
/* main */
int main(void) {
char s1[1024],cmd[1024];
gets(s1);
CmdTok(s1," ",2,cmd);
printf("%s\n", cmd);
return 0;
}
エラーに成ります・・・・
どこが良くなかったのでしょう…?
エラー E2034 divcmdl.cpp 11: 'int' 型は 'char *' 型に変換できない(関数 CmdTok(ch
ar *,char *,int,char *) )
エラー E2342 divcmdl.cpp 11: パラメータ '__s1' は char * 型として定義されている
ので char は渡せない(関数 CmdTok(char *,char *,int,char *) )
エラー E2034 divcmdl.cpp 11: 'char *' 型は 'char' 型に変換できない(関数 CmdTok(c
har *,char *,int,char *) )
エラー E2034 divcmdl.cpp 12: 'char *' 型は 'char' 型に変換できない(関数 CmdTok(c
har *,char *,int,char *) )
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//buf コマンドライン、div 区切り文字、n 何番目かのコマンドライン、 ret 切り出されたコマンドライン
int CmdTok(char *buf ,char *div,int n ,char *ret){
int i;
*ret = strtok(buf,div);
for(i=0;i<n-1;i++) *ret = strtok(NULL,div);
return 0;
}
/* main */
int main(void) {
char s1[1024],cmd[1024];
gets(s1);
CmdTok(s1," ",2,cmd);
printf("%s\n", cmd);
return 0;
}
Re:コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
ざっとしか見てませんが…
char *retはポインタですよね?
じゃあ *ret = strtok(buf,div)の*は要らないのでは?
char *retはポインタですよね?
じゃあ *ret = strtok(buf,div)の*は要らないのでは?
Re:コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
ありがとうございます。
うっかりしてました…
/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//buf ごっちゃのコマンドライン、div 区切り文字、n 何番目かのコマンドライン、 ret 切り出されたコマンドライン
int CmdTok(char *buf ,char *div,int n ,char *ret){
int i;
ret = strtok(buf,div);
for(i=0;i<n-1;i++) ret = strtok(NULL,div);
return 0;
}
int main(void) {
char s1[1024],*code;
gets(s1);
CmdTok(s1," ",4,code);
printf("cmdtok: %s\n", code);
return 0;
}
コンパイルはできたんですが、今度はトークン切り出しが出来ていないようです。
111 222 333 444 555 666 777
を入力しても、
cmdtok:
としか出てきませんでした・・・・
うっかりしてました…
/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//buf ごっちゃのコマンドライン、div 区切り文字、n 何番目かのコマンドライン、 ret 切り出されたコマンドライン
int CmdTok(char *buf ,char *div,int n ,char *ret){
int i;
ret = strtok(buf,div);
for(i=0;i<n-1;i++) ret = strtok(NULL,div);
return 0;
}
int main(void) {
char s1[1024],*code;
gets(s1);
CmdTok(s1," ",4,code);
printf("cmdtok: %s\n", code);
return 0;
}
コンパイルはできたんですが、今度はトークン切り出しが出来ていないようです。
111 222 333 444 555 666 777
を入力しても、
cmdtok:
としか出てきませんでした・・・・
Re:コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
すいません。イメージってこんな感じですか?
/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//buf ごっちゃのコマンドライン、div 区切り文字、n 何番目かのコマンドライン、 ret 切り出されたコマンドライン
int CmdTok(char *buf ,char *div,int n ,char **ret){
int i;
*ret = strtok(buf,div);
for(i=0;i<n-1;i++) *ret = strtok(NULL,div);
return 0;
}
int main(void) {
char s1[1024],*code;
gets(s1);
CmdTok(s1," ",3,&code);
printf("cmdtok: %s\n", code);
return 0;
}
/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//buf ごっちゃのコマンドライン、div 区切り文字、n 何番目かのコマンドライン、 ret 切り出されたコマンドライン
int CmdTok(char *buf ,char *div,int n ,char **ret){
int i;
*ret = strtok(buf,div);
for(i=0;i<n-1;i++) *ret = strtok(NULL,div);
return 0;
}
int main(void) {
char s1[1024],*code;
gets(s1);
CmdTok(s1," ",3,&code);
printf("cmdtok: %s\n", code);
return 0;
}
Re:コマンドラインからスペースで区切った文字列を分けて配列に入れたいです。
>for(i=0;i<n-1;i++) *ret = strtok(NULL,div);
なるほど!分かりました!
ありがとうございました。
なるほど!分かりました!
ありがとうございました。