在没有任何库函数的情况下,在c ++中切换字符串中的每对单词(“ab cd ef gh ijk”变为“cd ab gh ef ijk”)。
int main(){
char s[]="h1 h2 h3 h4";//sample input
switch_pair(s);
std::cout<<s;
return 0;
}
char * switch_pair(char *s){
char * pos = s;
char * ptr = s;
int sp = 0;//counts number of space
while(*pos){
if(*pos==' ' && ++sp==2){ //if we hit a space and it is second space then we've a pair
revStr_iter(ptr,pos-1);//reverse the pair so 'h1 h2' -> '2h 1h'
sp=0;//set no. of space to zero to hunt new pairs
ptr=pos+1;//reset ptr to nxt word after the pair i.e. h3'
}
pos++;
}
if(sp==1) //tackle the case where input is 'h1 h2' as only 1 space is there
revStr_iter(ptr,pos-1);
revWord(s); //this will reverse each individual word....i hoped so :'(
return s;
}
char* revStr_iter(char* l,char * r){//trivial reverse string algo
char * p = l;
while(l<r){
char c = *l;
*l = *r;
*r = c;
l++;
r--;
}
return p;
}
char* revWord(char* s){//this is the villain....need to fix it...Grrrr
char* pos = s;
char* w1 = s;
while(*pos){
if(*pos==' '){//reverses each word before space
revStr_iter(w1,pos-1);
w1=pos+1;
}
pos++;
}
return s;
}
输入 - h1 h2 h3 h4
预期 - h2 h1 h4 h3
实际 - h2 h1 h3 4h
任何高贵的极客都可以帮助PLZ:((
答案 0 :(得分:2)
IMO,到目前为止你所做的工作看起来/看起来更像C代码而不是C ++代码。我想我会从以下内容开始:
为此,我可能会定义一个非常小的字符串类。几乎所有它需要(现在)是能够创建一个字符串给定一个指向char和一个长度(或该顺序的东西)的指针,以及分配(或交换)字符串的能力。
我还要定义一个标记器。我不确定它是真的应该是一个函数还是一个类,但就目前而言,让我们说“功能”。它所做的只是查看一个字符串,找到一个单词的开头和结尾,产生类似指向开头的指针和单词的长度。
最后,您需要/想要一个数组来保存单词。对于第一步,您可以使用普通数组,然后在/如果您希望根据需要自动扩展数组,您可以编写一个小类来处理它。
答案 1 :(得分:1)
int Groups = 1; // Count 1 for the first group of letters
for ( int Loop1 = 0; Loop1 < strlen(String); Loop1++)
if (String[Loop1] == ' ') // Any extra groups are delimited by space
Groups += 1;
int* GroupPositions = new int[Groups]; // Stores the positions
for ( int Loop2 = 0, Position = 0; Loop2 < strlen(String); Loop2++)
{
if (String[Loop2] != ' ' && (String[Loop2-1] == ' ' || Loop2-1 < 0))
{
GroupPositions[Position] = Loop2; // Store position of the first letter
Position += 1; // Increment the next position of interest
}
}
如果您不能使用strlen,请编写一个对任何字母进行计数的函数,直到它遇到空终止符'\ 0'。