1

対象のタスクを達成しようとしていますが、コードが分割されません。主な機能は次のとおりです。

#define SQL_TEXT Latin_Text
#include <iostream>
#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include "Split.h"
#include <string>
#include <stdio.h>
#include <vector>
#include <cstring>

using namespace std;
int main ()
{
    VARCHAR_LATIN *result = new VARCHAR_LATIN[512];
    wchar_t *s1 = (wchar_t *)"Myýnameýisýzeeshan";
    **splitstringwc s(s1);
vector<wstring> flds = s.splitwc((wchar_t)'ý');**
    wstring rs = flds[1];
    wcout<<rs<<endl;
for (int k = 0; k < flds.size(); k++)
        cout << k << " => " << flds[k].data() << endl;

    cout<<result;
    return 0;
}

splitstringwc クラスのコードは次のとおりです。

public:
splitstringwc(wchar_t *s) : wstring(s) { };
vector<wstring>& splitwc(wchar_t delim, int rep=0);
};


vector<wstring>& splitstringwc::splitwc(wchar_t delim, int rep) {
if (!flds1.empty()) flds1.clear();  // empty vector if necessary
wstring ws = data();
wcout<<ws<<endl;
//wcout<<delim<<endl;

//wstring ws;
//int j = StringToWString(ws, work);
wstring buf = (wchar_t *)"";
int i = 0;
while (i < ws.size()) {
    if (ws.at(i) != delim)
        buf += ws.at(i);
    else if (rep == 1) {
        flds1.push_back(buf);
        buf = (wchar_t *)"";
    } else if (buf.size() > 0) {
        flds1.push_back(buf);
        buf = (wchar_t *)"";
    }
    i++;
}
if (!buf.empty())
    flds1.push_back(buf);
return flds1;

}

コードは入力文字列を分割しません。デバッグしようとすると、wstring ws = data(); でセグメンテーション違反が発生します。

助けてください...............

4

2 に答える 2

1

独自の分割関数の代わりに strtok を使用すると、Unicode 区切り文字に基づいて文字列が分割されます。

コードは次のとおりです。

str = "Myýnameýisýzeeshan";
char *pch;
pch = strtok(str, "ý");
while (pch != NULL)
{
    printf("%s\n", pch);
    pch = strtok(NULL, "ý");
}

str は、UNICODE 区切り文字で区切られた ANSI 文字列で構成されていることに注意してください。

于 2013-03-09T07:04:51.900 に答える
0

ワイド文字列を扱う場合、通常の文字列と文字リテラルは使用できません。それらもワイド文字でなければなりません。

const wchar_t *s1 = L"Myýnameýisýzeeshan";

リテラルの前にあることに注意してくださいL。これにより、文字列がワイド文字列になります。

同じことが文字リテラルにも使用されます。

s.splitwc(L'ý')
于 2013-03-08T14:28:39.373 に答える