C-分开串并解开它们

  • 本文关键字:串并 c string split token
  • 更新时间 :
  • 英文 :


我有一个分配,要求我们拆分字符串并解开它。例如:

" rsedreve*_ emth _*kema*_ ot _*si*_ _ 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 kema ot si si skta uryo

显然,这里的模式是从这些令牌的长度开始的一半开始,将这些字符添加到char []中,然后在每个令牌的开头添加字符。有人可以帮我出去并向我展示如何做到这一点吗?

当您拆分字符串时,您需要解开它们。我认为最简单的杂交方法是交换适当的字母。

因此,您可以找到中间,然后在开始等方面交换。例如,如果您有" 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;
}

,而不是简单地打印每个令牌,找到令牌的长度,进行解散,将其推到堆栈上,然后反向打印出来。

编辑:编辑为较少的解决方案,而不是有用的片段。

例如,您可以将数组用作简单的"堆栈"

    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]);
    }

可以准确地进行您描述的方式进行混乱。不要忘记挂麦洛克,这样您就不会更改原始字符串,因此可以在循环结束后保持字符串。

        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] = '';

也不要忘记末尾的空字符!

虽然冗长,但至少这样您可以在每个步骤中看到推理。

虽然有关于家庭作业问题的策略...?

#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]='';
       /*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");      

}

这是您要求的算法。

#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;
}