2014-02-04 3 views
0

У меня есть задание, которое требует, чтобы мы разделили строку и расширили ее. Например:Разбиение строк и их расшифровка

"rsedreve * _ emth _ * КЕМА * _ ВЗ _ * си * _ skta _ * uryo"

становится: «Ваша задача состоит в том, чтобы сделать их вспять. "

До сих пор для кода, я просто разделив строку:

char secondString[50]; 

char *secondString_ptr; 

strcpy(secondString, "rsedreve*_*emth*_*kema*_*ot*_*si*_*skta*_*uryo"); 

secondString_ptr = strtok(secondString, "*_*"); 

while(secondString_ptr != NULL){ 
      printf("%s ", secondString_ptr); 
      secondString_ptr = strtok(NULL, "*_*"); 
    } 

Выход:

rsedreve emth КЕМА ВЗ си skta uryo

Очевидно, что картина здесь, чтобы начать в половине длину этих токенов, добавьте эти символы в char [], а затем добавьте символы в начале каждого токена до конца. Может кто-нибудь помочь мне и показать мне, как это сделать?

ответ

0

Поскольку вы разделили строку, вам необходимо развернуть их. Я думаю, что самый простой способ разрешить это - заменить соответствующие буквы.

Таким образом, вы находите середину, затем свопите с началом и так далее. Например, если у вас есть «123456», нужно поменять местами 1 и 4, а затем 2 и 5, затем 3 и 6.

Вот основные функции, которые могли бы сделать это:

char* unscramble(char *input) 
{ 
     int len = strlen(input); 
     int half = len >> 1; 
     int i; 
     for (i=0 ;i<half; i++) 
     { 
       int temp = input[i]; 
       input[i] = input[half+i]; 
       input[half+i] = temp; 
     } 
     return input; 
} 
0

Вместо того, чтобы просто распечатывать каждый токен, находить длину токена, выполнять дешифрование, вставлять его в стек и распечатывать в обратном порядке.

Редактировать: отредактировано, чтобы быть более полным, но полезным.

Вы можете использовать массив, например, как простой 'стек'

char *pseudoStack[MAX_WORDS]; 
    int stackPos = 0; 

Добавить в стек, как этот

pseudoStack[stackPos] = unscrambled; 
    stackPos++; 

И печать, как это

for (i = stackPos - 1; i >= 0; i--) { 
     printf("%s ", pseudoStack[i]); 
     free(pseudoStack[i]); 
    } 

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

 char *unscrambled = malloc(MAX_WORD_LENGTH * sizeof(char)); 
     int unscrambledPos = 0; 
     for (i = middle; i < wordLength; i++) { 
      unscrambled[unscrambledPos] = secondString_ptr[i]; 
      unscrambledPos++; 
     } 
     for (i = 0; i < middle; i++) { 
      unscrambled[unscrambledPos] = secondString_ptr[i]; 
      unscrambledPos++; 
     } 
     unscrambled[wordLength] = '\0'; 

Также не забудьте нулевой символ в конце!

Хотя это довольно многословие, по крайней мере, таким образом вы можете видеть рассуждения на каждом шагу.

Есть ли политика по stackoverflow о домашних заданиях, хотя ...?

0
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
main() 
{ 
    char secondString[50]; 
    char *secondString_ptr; 
    int i,j,n,stack_pointer=0; 
    char *Word; 
    char *stack[50]; 
    strcpy(secondString, "rsedreve*_*emth*_*kema*_*ot*_*si*_*skta*_*uryo"); 

    secondString_ptr = strtok(secondString, "*_*"); 

    while(secondString_ptr != NULL){ 
      n=strlen(secondString_ptr); 
      Word=(char *)malloc(n); 
     /*the second half and the first half form the meaningful word*/ 
     /*so split the word into two part and assign to the variable. Like this*/ 
      for(i=n/2,j=0;i<n;i++) 
        Word[j++]=secondString_ptr[i]; 
      for(i=0;i<n/2;i++) 
        Word[j++]=secondString_ptr[i]; 
      Word[j]='\0'; 
     /*put all this word in the stack and increment the pointer*/ 
      secondString_ptr = strtok(NULL, "*_*"); 
    } 
    stack[stack_pointer]=NULL; 
    for(i=stack_pointer-1;i>=0;i--) 
      printf("%s ",stack[i]); 
    printf("\n");  

}

Это алгоритм для вашего требования.

+0

Это помогло в моем понимании, я ценю это! – user3268401

0
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

int unscrambling(char *str){ 
    char *p = strtok(str, "*_"); 
    if(p){ 
     char temp[50]; 
     int len = strlen(p); 
     int len1 = len >> 1; 
     int len2 = len - len1; 
     //char temp[len2]; 
/* 
     memcpy(temp, p, len2); 
     memcpy(p, p+len2, len1); 
     memcpy(p+len1, temp, len2); 
*/ 
     memcpy(temp, p, len1); 
     memcpy(p, p+len1, len2); 
     memcpy(p+len2, temp, len1); 
     if(unscrambling(NULL)) 
      *p = toupper(*p); 
     if(str) 
      printf("%s.\n", p); 
     else 
      printf("%s ", p); 
     return 0; 
    } 
    return 1; 
} 

int main(){ 
    char string[50]; 

    strcpy(string, "rsedreve*_*emth*_*kema*_*ot*_*si*_*skta*_*uryo"); 
    unscrambling(string); 
    strcpy(string, "rsedreve*_emth_*kema*_ot_*si*_skta_*uryo"); 
    unscrambling(string); 
    return 0; 
} 
+0

Это именно то, что мне нужно. Мог изменить его, чтобы разделить строку на любой символ, который я хотел. Большое спасибо!! – user3268401

+0

Кстати, этот алгоритм будет работать, только если слово, которое вы пытаетесь разрезать, имеет четное количество символов. Если это что-то вроде «без», у которого есть 7, оно будет выводить «итот». – user3268401

+0

@ user3268401 Предполагалось, что это «houtwit» -> «без», потому что не было примера в случае нечетного. Попробуйте исправить. – BLUEPIXY

Смежные вопросы