2013-07-12 5 views
0

У меня есть блок писателя на данный момент.C - Сортировка символьной строки в массиве равным значению пользователя char

Что я хочу - это иметь вид, который будет проверять, соответствует ли newWord wordInput, а если нет, он будет перемещать вокруг букв до тех пор, пока это не произойдет. Например, допустим, что wordInput - poop, а newWord - oopp, я хочу, чтобы newWord в конечном итоге превратился в poop, так как я могу поменять это?

Это код, который у меня есть до сих пор.

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

int main(){ 
    char wordInput[25]; 
    char newWord[25]; 
    char tmp; 
    int len; 
    int a, b; 

    wordInput = "poop"; 
    newWord = "oopp"; 

    len = strlen(newWord); 

    // Sort back to wordInput 
    for(a = 1; a < len; a++){ 
     for(b = 0; b < len - a; b++){ 
      if(newWord[b] != wordInput[b]){ 
       tmp = newWord[b]; 
       newWord[b] = newWord[b + 1]; 
       newWord[b + 1 ] = tmp; 
      } 
     } 
    } 
    printf("Back to original input: %s\n", newWord); 
} 
+4

Поскольку 'wordInput' все еще держит исходную строку, почему бы не использовать ту или' strcpy' от него? – simonc

+0

есть, совершенно. – 0decimal0

+0

После того, как я получу помощь, чтобы отсортировать его до исходного ввода, я хочу, чтобы он показывал, что такое «newWord» после каждого свопа. Например: poop -> oopp -> opop -> poop – chakolatemilk

ответ

1
#include <stdio.h> 
#include <string.h> 

void swap(char *a, char *b){ 
    char wk = *a; 
    *a = *b; 
    *b = wk; 
} 

int main(void){ 
    char wordInput[25]; 
    char newWord[25]; 
    int i, len; 
    char *p; 

    strcpy(wordInput, "poop"); 
    strcpy(newWord, "oopp"); 

    len = strlen(newWord);//assert(strlen(newWord)==strlen(wordInput)) 

    printf("newWold:%s\n",newWord); 
    for(i = 0; i < len; ++i){ 
     if(wordInput[i] == newWord[i]) 
      continue; 
     if(NULL!=(p=strchr(&newWord[i+1], wordInput[i]))) 
      swap(&newWord[i], p); 
     else 
      break; 
    } 
    if(i < len){ 
     printf("can't...orz\n"); 
    } else { 
     printf("Back to original input: %s\n", newWord); 
    } 
    return 0; 
} 
1

ОК, так что в основном вы хотите преобразовать отсортированный массив букв в конкретных (случайный?) Порядок и запись свопы по пути, не так ли?

Вот один из способов сделать это.

#define SWAP(a,b) a^=b;b^=a;a^=b 

int main(int argc, char* argv[]) { 
    char* wordInput=argv[1]; 
    char* newWord = (char*)malloc((strlen(wordInput) + 1) * (sizeof(char))); 

    int i,j,k; 
    fprintf(stdout, "Word is %s\n", wordInput); 
    // Sort wordInput into newWord. 
    for (i=0; i<strlen(wordInput); i++) { 
    // Put this one at the end. 
    newWord[i]=wordInput[i]; 
    // Start at the back of the string, and move it forward if it is less. 
    for (j=i-1; j>=0; j--) { 
     if (newWord[j+1] < newWord[j]) { 
     SWAP(newWord[j+1], newWord[j]); 
     } else { 
     break; 
     } 
    } 
    } 
    newWord[strlen(wordInput)]='\0'; 

    fprintf(stdout, "Converting sorted word %s back to %s...\n", newWord, wordInput); 
    // Recover the original word making swaps. 
    for (i=0; i<strlen(wordInput)-1; i++) { 
    // Locate this letter in the newWord. 
    for (j=i; j<strlen(newWord); j++) { 
     if (newWord[j]==wordInput[i]) { 
     // Move this letter to the front if it isn't already there. 
     if (i != j) { 
      SWAP(newWord[j], newWord[i]); 
      fprintf(stdout, "Swapping %d with %d --> %s\n", i, j, newWord); 
     } 
     break; 
     } 
    } 
    } 
} 
+0

Что я действительно хочу, чтобы программа не выполняла техническую запись фактической замены, а затем воспроизводила ее назад. То, что я хочу, это в основном это: wordInput = poop, newWord = oopp, как я могу заставить newWord продолжать заменять буквы, пока он не станет равным wordInput? – chakolatemilk

+0

Это не записывает оригинальные свопы. Посмотрите на алгоритм после «Преобразование отсортированного слова% s обратно в% s ...». Что это означает, что первая буква в wordInput (p в вашем случае) принимает первое письмо и находит первый экземпляр этого в newWord (первая p в oopp - это третья буква). Затем он заменяет это письмо текущей буквой в newWord. Затем он переходит к следующей букве в wordInput и так далее. В вашем примере свопы тогда будут oopp -> poop. Он заменит первое письмо третьим и будет сделано. – Trenin

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

  • Нет связанных вопросов^_^