初めて質問します。初心者です。よろしくお願いします。
str = "a,111,,,2,bb"
上記のようなデータをそれぞれ読み込むにはどうしたら良いでしょうか?
strtok(str,",") を使うと、
データが無いところが飛ばされてしまうので、データの順番がおかしくなってしまいます。それらを飛ばさずに下記のようにするにはどうすれば良いでしょうか?
data[1]="a"
data[2]="111"
data[3]=""
data[4]=""
data[5]="2"
data[6]="bb"
> どうすれば良いでしょうか?
当たり前の話ですが、ライブラリの関数だけで実現できないロジックは自分で組み立てます。
// Cの例(オーバーフロー対策は省略)
#include <stdio.h>
#define COLS 16 // カラム数の上限
#define WIDTH 32 // 1カラムあたり文字数('\0'含む)の上限
int main()
{
const char* str = "a,111,,,2,bb"; // sample string
char data[COLS][WIDTH];
int cols, i;
const char* p;
cols = i = 0;
for( p = str; *p != '\0'; p++ )
{
if( *p != ',' )
{
data[ cols ][ i++ ] = *p;
}
else
{
data[ cols++ ][ i ] = '\0';
i = 0;
}
}
data[ cols++ ][ i ] = '\0';
for( i = 0; i < cols; i++ )
{
printf( "data[%d] = \"%s\"\n", i, data[ i ] );
}
return 0;
}
// C++の例
#include <string>
#include <vector>
#include <iostream>
int main()
{
using namespace std;
const string str = "a,111,,,2,bb"; // sample string
vector< string > data;
string::size_type s = 0;
for( string::size_type e = str.find_first_of( ',' ); e != string::npos; e = str.find_first_of( ',', s ) )
{
data.push_back( str.substr( s, e - s ) );
s = e + 1;
}
data.push_back( str.substr( s ) );
for( vector< string >::size_type i; i < data.size(); ++i )
{
cout << "data[" << i << "] = \""<< data[i] << "\"" << endl;
}
}
/* 実行結果(C, C++共通)
data[0] = "a"
data[1] = "111"
data[2] = ""
data[3] = ""
data[4] = "2"
data[5] = "bb"
*/
素早いご返答ありがとうございます。
正直、こんなに早くさくっと教えていただいて少々感激しております。
ありがとうございました。
ツイート | ![]() |