C-将数组中的字符字符串排序为等于字符用户输入
我现在有写作障碍 我想要的是有一个排序,它将检查newWord是否等于wordInput,如果不等于,它将继续交换字母,直到它这样做。例如,假设wordInput是poop,newWord是oopp,我希望newWord最终变成poop,那么我如何交换呢 这是我目前掌握的代码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];
#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;
}