C-将数组中的字符字符串排序为等于字符用户输入

C-将数组中的字符字符串排序为等于字符用户输入,c,arrays,sorting,alphabet,C,Arrays,Sorting,Alphabet,我现在有写作障碍 我想要的是有一个排序,它将检查newWord是否等于wordInput,如果不等于,它将继续交换字母,直到它这样做。例如,假设wordInput是poop,newWord是oopp,我希望newWord最终变成poop,那么我如何交换呢 这是我目前掌握的代码 #include<stdio.h> #include<string.h> int main(){ char wordInput[25]; char newWord[25];

我现在有写作障碍

我想要的是有一个排序,它将检查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 );
}
#包括
#包括
int main(){
字符输入[25];
char新词[25];
char-tmp;
内伦;
INTA,b;
wordInput=“poop”;
newWord=“oopp”;
len=strlen(新词);
//排序回wordInput
对于(a=1;a
好的,那么基本上您希望将已排序的字母数组转换为特定(随机?)顺序,并记录交换过程,对吗

这里有一种方法可以做到这一点

#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;
      }
    }
  } 
}
定义交换(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(标准输出,“字是%s\n”,字输入); //将wordInput排序为newWord。 对于(i=0;i=0;j--){ if(新词[j+1]<新词[j]){ 交换(新词[j+1],新词[j]); }否则{ 打破 } } } 新词[strlen(wordInput)]='\0'; fprintf(stdout,“将已排序的字%s转换回%s…”,newWord,wordInput); //恢复原始的造词交换。 对于(i=0;i
#包括
#包括
无效交换(字符*a,字符*b){
char wk=*a;
*a=*b;
*b=周;
}
内部主(空){
字符输入[25];
char新词[25];
int i,len;
char*p;
strcpy(wordInput,“poop”);
strcpy(新词“oopp”);
len=strlen(newWord);//断言(strlen(newWord)==strlen(wordInput))
printf(“newWold:%s\n”,newWord);
对于(i=0;i
既然
wordInput
仍然保留原始字符串,为什么不直接使用它或
strcpy
呢?在我得到帮助将其排序回原始输入后,我希望它显示“新词”是什么是在每次交换之后。例如:poop->oopp->opop->poopt除非您记录每次交换,否则无法撤消排序。例如,您可以保留一个交换数组,然后通过向后遍历来撤消它们。无法撤消排序的原因是排序对无序列表应用某些排序。为了还原这个,你需要知道原始无序列表的性质才能撤销它。好吧,这个怎么样?忘记我已经做了一个交换的事实。比如说wordInput=poop和newWord=oopp,我怎么能让newWord一直交换直到它等于wordInput?我真正想要的是程序做的不是从技术上记录a实际交换,然后向后播放。我想让它做的基本上是这样的:wordInput=poop,newWord=oopp,我如何让newWord不断交换字母,直到它等于wordInput?这不会记录原始交换。请看“将排序的单词%s转换回%s…”后的算法.它是做什么的呢?它以wordInput中的第一个字母(在您的例子中是p)为准,并在newWord中找到该字母的第一个实例(oopp中的第一个p是第三个字母)。然后,它将此字母与newWord中当前的第一个字母交换。然后,它将转到wordInput中的下一个字母,依此类推。在您的示例中,交换将是oopp->poop。它将第一个字母与第三个字母交换,然后完成。
#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;
}