Переключите каждую пару слов в строке («ab cd ef gh ijk» становится «cd ab gh ef ijk») в c / c ++ - PullRequest
1 голос
/ 04 марта 2011

Переключение каждой пары слов в строке («ab cd ef gh ijk» становится «cd ab gh ef ijk») в c ++ без какой-либо библиотечной функции.

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

может любой благородный душевный ум помочь, плз: (((

Ответы [ 2 ]

2 голосов
/ 04 марта 2011

IMO, то, над чем вы работаете до сих пор, выглядит / кажется больше похожим на код C, чем на код C ++.Я думаю, я бы начал с чего-то вроде:

  1. разбить ввод на объекты слова
  2. поменять пары объектов слова
  3. восстановить строку переставленных слов

Для этого я бы определил действительно минимальный класс строк.Почти все, что ему нужно (на данный момент), - это способность создавать строку с указателем на символ и длину (или что-то в этом порядке), а также возможность назначать (или менять) строки.

Iтакже определю токенизатор.Я не уверен, должна ли это быть функция или класс, но сейчас давайте просто скажем «функция».Все, что он делает, это смотрит на строку и находит начало и конец слова, получая что-то вроде указателя на начало и длину слова.

Наконец, вам нужно / нужно, чтобы массив содержалслова.Для первого шага вы можете просто использовать обычный массив, затем позже, когда / если вы хотите, чтобы массив автоматически расширялся по мере необходимости, вы можете написать небольшой класс для его обработки.

1 голос
/ 04 марта 2011
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'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...