最后一个逗号
帮忙写个函数,功能是实现 将一字符串中 逗号间 或 逗号后没有字符的补零,再保存到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 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
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++的书的前言里面说过
“用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;}