读书人

最后一个逗号,该怎么解决

发布时间: 2012-03-15 11:50:39 作者: rapoo

最后一个逗号
帮忙写个函数,功能是实现 将一字符串中 逗号间 或 逗号后没有字符的补零,再保存到vector中。
例:a,,,b,
调用该函数后 输出为:a,0,0,b,0
要求用C++实现

void getStr(string str,char speCh,vector<string>&v)
{
int begin = 0;

for(int i=0;i<str.length();++i)
{

if(str[i]==speCh)
{
string temp = str.substr(begin,i-begin);

if(temp == "")

v.push_back("0");
else

v.push_back(temp);

begin=i+1;
}
}
}
这个函数只能读到最后一个逗号a,,,b。

逗号后面的b也不能保存到vector

[解决办法]
用sprintf()解析
[解决办法]

C/C++ code
            if(str[i-1]==speCh)//这个判断条件改下就好了                v.push_back("0");            else                v.push_back(temp);
[解决办法]
很简单,用istringstream 配合函数getline,第三个参数用','
[解决办法]
为什么不用我的试下呢?
[解决办法]
直接用字符的阿斯卡马一个一个判断,然后存入vector.pushback()不就好了!?最后是,就加0
[解决办法]
仅供参考
C/C++ code
#include <stdio.h>#include <string.h>char string[80];char seps1[3];char seps2[3];char *token;char *zzstrtok (    char *string,    const char *control1,//连续出现时视为中间夹空token    const char *control2 //连续出现时视为中间无空token    ){    unsigned char *str;    const unsigned char *ctrl1 = control1;    const unsigned char *ctrl2 = control2;    unsigned char map1[32],map2[32];    static char *nextoken;    static char flag=0;    unsigned char c;    int L;    memset(map1,0,32);    memset(map2,0,32);    do {        map1[*ctrl1 >> 3] |= (1 << (*ctrl1 & 7));    } while (*ctrl1++);    do {        map2[*ctrl2 >> 3] |= (1 << (*ctrl2 & 7));    } while (*ctrl2++);    if (string) {        if (control2[0]) {            L=strlen(string);            while (1) {                c=string[L-1];                if (map2[c >> 3] & (1 << (c & 7))) {                    L--;                    string[L]=0;                } else break;            }        }        if (control1[0]) {            L=strlen(string);            c=string[L-1];            if (map1[c >> 3] & (1 << (c & 7))) {                string[L]=control1[0];                string[L+1]=0;            }        }        str=string;    }    else        str=nextoken;    string=str;    while (1) {        if (0==flag) {            if (!*str) break;            if (map1[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                break;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                string++;                str++;            } else {                flag=1;                str++;            }        } else if (1==flag) {            if (!*str) break;            if (map1[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                flag=0;                break;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                flag=2;                break;            } else str++;        } else {//2==flag            if (!*str) return NULL;            if (map1[*str >> 3] & (1 << (*str & 7))) {                str++;                string=str;                flag=0;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                str++;                string=str;            } else {                string=str;                str++;                flag=1;            }        }    }    nextoken=str;    if (string==str) return NULL;    else             return string;}void main(){   strcpy(string,"A \tstring\t\tof ,,tokens\n\nand some  more tokens, ");   strcpy(seps1,",\n");strcpy(seps2," \t");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"1234| LIYI|China | 010 |201110260000|OK");   strcpy(seps1,"|");strcpy(seps2," ");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"1234|LIYI||010|201110260000|OK");   strcpy(seps1,"");strcpy(seps2,"|");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"1234|LIYI||010|201110260000|OK");   strcpy(seps1,"|");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"a");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"a,b");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"a,,b");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",a");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,"a,");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",a,,b");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",,a,,b,,");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",,");   strcpy(seps1,",");strcpy(seps2,"");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }   strcpy(string,",,,");   strcpy(seps1,",");strcpy(seps2," ");   printf("\n[%s]\nTokens:\n",string);   token=zzstrtok(string,seps1,seps2);   while (token!=NULL) {      printf(" <%s>",token);      token=zzstrtok(NULL,seps1,seps2);   }}////[A      string          of ,,tokens////and some  more tokens,]//Tokens:// <A>, <string>, <of>, <>, <tokens>, <>, <and>, <some>, <more>, <tokens>, <>,//[1234| LIYI|China | 010 |201110260000|OK]//Tokens:// <1234>, <LIYI>, <China>, <010>, <201110260000>, <OK>,//[1234|LIYI||010|201110260000|OK]//Tokens:// <1234>, <LIYI>, <010>, <201110260000>, <OK>,//[1234|LIYI||010|201110260000|OK]//Tokens:// <1234>, <LIYI>, <>, <010>, <201110260000>, <OK>,//[a]//Tokens:// <a>,//[a,b]//Tokens:// <a>, <b>,//[a,,b]//Tokens:// <a>, <>, <b>,//[,a]//Tokens:// <>, <a>,//[a,]//Tokens:// <a>, <>,//[,a,,b]//Tokens:// <>, <a>, <>, <b>,//[,,a,,b,,]//Tokens:// <>, <>, <a>, <>, <b>, <>, <>,//[,]//Tokens:// <>, <>,//[,,]//Tokens:// <>, <>, <>,//[,,,]//Tokens:// <>, <>, <>, <>, 


[解决办法]
你的代码看地纠结,重写了个

C/C++ code
void getStr1(string str,char speCh,vector<string>&v){    int i ;    for (i=0; i<str.length()-1;i++)    {        if (str[i] == speCh && str[i+1] == speCh)        {            str.insert(str.begin()+i+1,1,'0');            cout << str << endl;        }    }    if (str[str.length()-1] == speCh)    {        str.push_back('0');    }    for (i=0; i<str.length(); i++)    {        string temp = str.substr(i,1);        v.push_back(temp);    }}
[解决办法]
C/C++ code
#include <iostream>#include <sstream>#include <string>#include <vector>using namespace std;int main(){    vector<int> iv;    string input;    getline(cin, input);    istringstream iss(input);    string word;    while(getline(iss, word, ',')){    if(word.length() == 0)        iv.push_back(0);    else{        int number;        istringstream iss(word);        iss >> number;        iv.push_back(number);    }    }    if(input[input.length() - 1] == ',')    iv.push_back(0);    vector<int>::iterator it = iv.begin();    for( ; it != iv.end(); ++it){    cout << *it << ends;    }    return 0;}
[解决办法]
C/C++ code
void getStr(string str,char speCh){    int begin = 0;    for(int i=0;i<str.length();++i)    {        if(str[i]==speCh)        {            string temp = str.substr(begin,i-begin);            if(str[i-1]==speCh)                printf("0\n");            else                cout<<temp<<endl;            begin=i+1;        }    }}
[解决办法]
C/C++ code
getStr("abbb,,,a,a,c", ',');//我调用这个函数,输出为什么没错????
[解决办法]
探讨
你的代码看地纠结,重写了个

C/C++ code
void getStr1(string str,char speCh,vector<string>&v)
{
int i ;
for (i=0; i<str.length()-1;i++)
{
if (str[i] == speCh && str[i+1] == sp……

[解决办法]
C/C++ code
void getStr(string str,char speCh){    int begin = 0;    int i = 0;    for(i=0;i<str.length();++i)    {        if(str[i]==speCh)        {            string temp = str.substr(begin,i-begin);            if(str[i-1]==speCh)                printf("0\n");            else                cout<<temp<<endl;            begin=i+1;        }    }    if(str[i-1]==speCh)        printf("0\n");}
[解决办法]
C/C++ code
void getStr(string str,char speCh,vector<string>&v){    int begin = 0;int i = 0;    for(i=0;i<str.length();++i)    {        if(str[i]==speCh)        {            string temp = str.substr(begin,i-begin);            if(str[i-1]==speCh)                v.push_back("0");            else                v.push_back(temp);            begin=i+1;        }    }    if(str[i-1]==speCh)        v.push_back("0");}
[解决办法]
楼主要懂得变通。。。。额
[解决办法]
哦,是字符串啊,那程序就简单多了
C/C++ code
#include <iostream>#include <sstream>#include <string>#include <vector>using namespace std;int main(){    vector<string> iv;    string input;   //input为输入字串    getline(cin, input);    istringstream iss(input);    string word;    while(getline(iss, word, ',')){    if(word.length() == 0)        iv.push_back(string('0'));    else{        iv.push_back(word);    }    }    if(input[input.length() - 1] == ',')    iv.push_back(string('0'));    //以下是为了打印结果    vector<int>::iterator it = iv.begin();    for( ; it != iv.end(); ++it){    cout << *it << endl;    }    return 0;} 


[解决办法]
24楼的贴错了应该是

C/C++ code
#include <iostream>#include <sstream>#include <string>#include <vector>using namespace std;int main(){    vector<string> iv;    string input;    getline(cin, input);    istringstream iss(input);    string word;    while(getline(iss, word, ',')){    if(word.length() == 0)        iv.push_back(string("0"));    else{        iv.push_back(word);    }    }    if(input[input.length() - 1] == ',')    iv.push_back(string("0"));    vector<string>::iterator it = iv.begin();    for( ; it != iv.end(); ++it){    cout << *it << endl;    }    return 0;}
[解决办法]
探讨
你的代码看地纠结,重写了个

C/C++ code
void getStr1(string str,char speCh,vector<string>&v)
{
int i ;
for (i=0; i<str.length()-1;i++)
{
if (str[i] == speCh && str[i+1] == sp……

[解决办法]
这个。。可以吗??
C/C++ code
string s = "abbb,,,c,";    vector<char> cvec;    for (int i = 0; i < s.length() - 1; i++)    {        if (s[i] != 32)        {            cvec.push_back(s[i]);            if (s[i] == 44)            {                if (s[i+1] ==32 || s[i+1] == 44)                {                    cvec.push_back('0');                }            }        }    }    cvec.push_back(s[s.length() - 1]);    if (s[s.length() - 1] == 44)        cvec.push_back('0');    for (int j = 0; j < cvec.size(); j++)    {        printf("%c", cvec[j]);    }
[解决办法]
C/C++ code
void getStr(string str,char speCh,vector<string>&v){    for (int i = 0; i < str.length() - 1; i++)    {        string temp = str.substr(i, 1);        if (str[i] != 32)        {            v.push_back(temp);            if (str[i] == speCh)            {                if (str[i+1] == 32 || str[i+1] == speCh)                {                    v.push_back("0");                }            }        }    }    string tep = str.substr(str.length() - 1, 1);    v.push_back(tep);    if (str[str.length() - 1] == speCh)        v.push_back("0");}
[解决办法]
探讨
仅供参考

C/C++ code
#include <stdio.h>
#include <string.h>
char string[80];
char seps1[3];
char seps2[3];
char *token;
char *zzstrtok (
char *string,
const char *control1,//连续出现时视为中间夹空……

[解决办法]
记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”
C/C++ code
#include <stdio.h>#include <string.h>char ln[1000];FILE *fi,*fo;char fni[260]="i.txt";char fno[260]="o.txt";int n;char seps1[3];char seps2[3];char *token;char *zzstrtok (    char *string,    const char *control1,//连续出现时视为中间夹空token    const char *control2 //连续出现时视为中间无空token    ){    unsigned char *str;    const unsigned char *ctrl1 = control1;    const unsigned char *ctrl2 = control2;    unsigned char map1[32],map2[32];    static char *nextoken;    static char flag=0;    unsigned char c;    int L;    memset(map1,0,32);    memset(map2,0,32);    do {        map1[*ctrl1 >> 3] |= (1 << (*ctrl1 & 7));    } while (*ctrl1++);    do {        map2[*ctrl2 >> 3] |= (1 << (*ctrl2 & 7));    } while (*ctrl2++);    if (string) {        if (control2[0]) {            L=strlen(string);            while (1) {                c=string[L-1];                if (map2[c >> 3] & (1 << (c & 7))) {                    L--;                    string[L]=0;                } else break;            }        }        if (control1[0]) {            L=strlen(string);            c=string[L-1];            if (map1[c >> 3] & (1 << (c & 7))) {                string[L]=control1[0];                string[L+1]=0;            }        }        str=string;    }    else        str=nextoken;    string=str;    while (1) {        if (0==flag) {            if (!*str) break;            if (map1[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                break;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                string++;                str++;            } else {                flag=1;                str++;            }        } else if (1==flag) {            if (!*str) break;            if (map1[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                flag=0;                break;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                flag=2;                break;            } else str++;        } else {//2==flag            if (!*str) return NULL;            if (map1[*str >> 3] & (1 << (*str & 7))) {                str++;                string=str;                flag=0;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                str++;                string=str;            } else {                string=str;                str++;                flag=1;            }        }    }    nextoken=str;    if (string==str) return NULL;    else             return string;}int main() {    fi=fopen(fni,"r");    if (NULL==fi) {        fprintf(stderr,"Can not open file %s!\n",fni);        return 1;    }    fo=fopen(fno,"w");    if (NULL==fo) {        fclose(fi);        fprintf(stderr,"Can not create file %s!\n",fno);        return 2;    }    strcpy(seps1,",");strcpy(seps2,"");    while (1) {        if (NULL==fgets(ln,1000,fi)) break;        if ('\n'==ln[strlen(ln)-1]) ln[strlen(ln)-1]=0;        token=zzstrtok(ln,seps1,seps2);        n=0;        while (token!=NULL) {            if (0==n) {                if (0==token[0]) {                    fprintf(fo,"0");                } else {                    fprintf(fo,"%s",token);                }                n++;            } else {                if (0==token[0]) {                    fprintf(fo,",0");                } else {                    fprintf(fo,",%s",token);                }            }            token=zzstrtok(NULL,seps1,seps2);        }        fprintf(fo,"\n");    }    fclose(fo);    fclose(fi);    return 0;}//i.txt://21,0x10,28,0,1,1,1,,,,,,,,,17,,,,,,,6,0xE70C,,,,,,,,,,,,,,,,,8,8,8,8,8,8,8,,,,,,,,,,交差点名称,交差点名称,//93,0x80,12,0,1,1,1,,,,,,,,,5111,13,0xEF10,,,,,7,0xEF10,,,,,,,,,,1,,,,,,,C,C,C,C,C,C,C,,,,,,,,,,外国の,外国の,11秋面引きフラグ定//93,0x80,13,0,1,1,1,,,,,,,,,5112,13,0xE70D,,,,,7,0xE70D,,,,,,,,,,,,,,,,,C,C,C,C,C,C,C,,,,,,,,,,公社,公社,//93,0x80,14,0,1,1,1,,,,,,,,,5109,13,0xEF4B,,,,,7,0xEF4B,,,,,,,,,,,,,,,,,C,C,C,C,C,C,C,,,,,,,,,,都府の,都府の,//93,0x80,15,0,1,1,1,,,,,,,,,5110,13,0xEF4C,,,,,7,0xEF4C,,,,,,,,,,,,,,,,,C,C,C,C,C,C,C,,,,,,,,,,市町村の,市町村の,//o.txt://21,0x10,28,0,1,1,1,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,6,0xE70C,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,0,0,0,0,0,0,0,0,0,交差点名称,交差点名称,0//93,0x80,12,0,1,1,1,0,0,0,0,0,0,0,0,5111,13,0xEF10,0,0,0,0,7,0xEF10,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,C,C,C,C,C,C,C,0,0,0,0,0,0,0,0,0,外国の,外国の,11秋面引きフラグ定//93,0x80,13,0,1,1,1,0,0,0,0,0,0,0,0,5112,13,0xE70D,0,0,0,0,7,0xE70D,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,C,C,C,C,C,C,C,0,0,0,0,0,0,0,0,0,公社,公社,0//93,0x80,14,0,1,1,1,0,0,0,0,0,0,0,0,5109,13,0xEF4B,0,0,0,0,7,0xEF4B,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,C,C,C,C,C,C,C,0,0,0,0,0,0,0,0,0,都府の,都府の,0//93,0x80,15,0,1,1,1,0,0,0,0,0,0,0,0,5110,13,0xEF4C,0,0,0,0,7,0xEF4C,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,C,C,C,C,C,C,C,0,0,0,0,0,0,0,0,0,市町村の,市町村の,0 


[解决办法]
给上贴中的C代码加了必要的强制类型转换,避免C++编译出错。

C/C++ code
#include <stdio.h>#include <string.h>char ln[1000];FILE *fi,*fo;char fni[260]="i.txt";char fno[260]="o.txt";int n;char seps1[3];char seps2[3];char *token;char *zzstrtok (    char *string,    const char *control1,//连续出现时视为中间夹空token    const char *control2 //连续出现时视为中间无空token    ){    unsigned char *str;    const unsigned char *ctrl1 = (const unsigned char *)control1;    const unsigned char *ctrl2 = (const unsigned char *)control2;    unsigned char map1[32],map2[32];    static char *nextoken;    static char flag=0;    unsigned char c;    int L;    memset(map1,0,32);    memset(map2,0,32);    do {        map1[*ctrl1 >> 3] |= (1 << (*ctrl1 & 7));    } while (*ctrl1++);    do {        map2[*ctrl2 >> 3] |= (1 << (*ctrl2 & 7));    } while (*ctrl2++);    if (string) {        if (control2[0]) {            L=strlen(string);            while (1) {                c=string[L-1];                if (map2[c >> 3] & (1 << (c & 7))) {                    L--;                    string[L]=0;                } else break;            }        }        if (control1[0]) {            L=strlen(string);            c=string[L-1];            if (map1[c >> 3] & (1 << (c & 7))) {                string[L]=control1[0];                string[L+1]=0;            }        }        str=(unsigned char *)string;    }    else str=(unsigned char *)nextoken;    string=(char *)str;    while (1) {        if (0==flag) {            if (!*str) break;            if (map1[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                break;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                string++;                str++;            } else {                flag=1;                str++;            }        } else if (1==flag) {            if (!*str) break;            if (map1[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                flag=0;                break;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                *str=0;                str++;                flag=2;                break;            } else str++;        } else {//2==flag            if (!*str) return NULL;            if (map1[*str >> 3] & (1 << (*str & 7))) {                str++;                string=(char *)str;                flag=0;            } else if (map2[*str >> 3] & (1 << (*str & 7))) {                str++;                string=(char *)str;            } else {                string=(char *)str;                str++;                flag=1;            }        }    }    nextoken=(char *)str;    if (string==(char *)str) return NULL;    else             return string;}int main() {    fi=fopen(fni,"r");    if (NULL==fi) {        fprintf(stderr,"Can not open file %s!\n",fni);        return 1;    }    fo=fopen(fno,"w");    if (NULL==fo) {        fclose(fi);        fprintf(stderr,"Can not create file %s!\n",fno);        return 2;    }    strcpy(seps1,",");strcpy(seps2,"");    while (1) {        if (NULL==fgets(ln,1000,fi)) break;        if ('\n'==ln[strlen(ln)-1]) ln[strlen(ln)-1]=0;        token=zzstrtok(ln,seps1,seps2);        n=0;        while (token!=NULL) {            if (0==n) {                if (0==token[0]) {                    fprintf(fo,"0");                } else {                    fprintf(fo,"%s",token);                }                n++;            } else {                if (0==token[0]) {                    fprintf(fo,",0");                } else {                    fprintf(fo,",%s",token);                }            }            token=zzstrtok(NULL,seps1,seps2);        }        fprintf(fo,"\n");    }    fclose(fo);    fclose(fi);    return 0;} 

读书人网 >C++

热点推荐