Разбиение массива char на другие массивы для последующего использования и игнорирование чисел c++

Поэтому у меня есть это назначение, где вы должны переместить Буквы в массиве символов на заданное количество перемещений. Последняя буква должна стать первой. Например:

Вход: Hello 3
Выход: lloHe

Но если у вас есть предложение, вы должны сделать это для каждого слова отдельно, и, более того, если есть числа, вы должны игнорировать их. Поэтому у меня проблемы с проверкой чисел и с отдельными словами(я использую strtokих для разделения). Это то, что у меня есть до сих пор:

#include <iostream>
#include <cstring>

using namespace std;


void Reposition(char text[10000], int n, char result[10000])
{
    int startIndex = strlen(text)-1;
    int k = n-1;

    int currentIndex = 0;
    for(int i = 0; i < n; i++)
    {
        result[k] = text[startIndex];
        k--;
        startIndex--;
        currentIndex++;

    }

    for(int i = 0; i <= startIndex; i++)
    {
        result[currentIndex] = text[i];
        currentIndex++;
    }
}


int main()
{
    char text[10000];
    cin.getline(text,10000);
    int n;
    cin >> n;
    char result[10000];

    char *words;
    words = strtok(text, " .,");

    while(words != NULL)
    {
        Reposition(text, n, result);
        words = strtok(NULL, " .,");

    }


    for(unsigned i = 0; i <= strlen(result); i++)
       cout << result[i];


    return 0;
}

3 ответа

  1. Использовать std::stringвместо строки C-style

    Чтобы удалить числа из строки, используйте std::remove_iffrom <algorithm>:

    std::string s;
    . . .
    s.erase(std::remove_if(s.begin(), s.end(), ::isdigit), s.end());
    

    Чтобы изменить положение символов в строке, используйте std::rotate:

    std::rotate(s.begin(), s.begin() + 1, s.end());
    
  2. Я сделал твое домашнее задание.
    Не знаю, знакомы ли вы со всем этим кодом.
    Я также переписал ваш код перемещения. Это выглядело очень грязно…..
    Один раз одолжение от меня. Постарайтесь извлечь из этого урок.

    #include <iostream>
    #include <cstring>
    #include <ctype.h>
    
    using namespace std;
    
    
    void Reposition(char * text, int len, int n, char * result)
    {
        int k = n - 1;
        for(int i = 0; i < len; i++)
        {
            result[i] = text[k++];
            if(k == len) k = 0;
        }
    }
    
    
    int main()
    {
        char text[10000];
        cin.getline(text,10000);
        int n;
        cin >> n;
        char result[10000];
    
        char * word;
        char * beginOfWord = text;
        char * resultPointer = result;
        int wordLen;
    
        while(* beginOfWord)
        {
            // copy up to somthing from the alphabet
            if(!isalpha(* beginOfWord))
            {
                *resultPointer++ = * beginOfWord++;
                continue;
            }
            // Find the end of this word
            word = strpbrk(beginOfWord, " .,0123456789");
            if(word != NULL)
            {
                // len is distance between end of word and begin of word
                wordLen = word - beginOfWord;
            }
            else
            {
                // Maybe it is the end of the string
                wordLen = strlen(beginOfWord);
            }
            //reposition the word
            Reposition(beginOfWord, wordLen, n, resultPointer);
            // Move the pointers beyond the word
            beginOfWord += wordLen;
            resultPointer += wordLen;
        }
        //Always terminate
        *resultPointer ='\x0';
        cout << result;
        return 0;
    }
    
  3. //reverse will reverse the string starting at position xn and ending at position (yn-1)
    void reverse(char *str, int xn, int yn)
    {
            //positioning the pointers appropriately
            char *start = str + xn;
            char *end = str + yn - 1;
    
            char temp;
            while(start < end)
            {
                    temp = *start;
                    *start = *end;
                    *end = temp;
    
                    ++start;
                    --end;
            }
    }
    
    //one of the logic to reposition
    void reposition(char *str, int n)
    {
        int length = strlen(str);
    
        n = (length > n) ? n : (n % length);
    
        reverse(str, 0, n);
        reverse(str, n, length);
        reverse(str, 0, length);
    }
    
    int main()
    {
        char text[10000];
        cin.getline(text,10000);
        int n;
        cin >> n;
        char result[10000];
    
        strcpy(result, text);
    
        cout << "before: " << result << endl;
    
        char *word;
        word = strtok(text, " .,");
    
        while(word != NULL)
        {
                //check if it is not a number
                if(isdigit(word[0]) == 0)
                {
                                reposition(word, n);
    
                                //find the word postion in text
                                int word_position = word - text;
    
                                //copy the repositioned word in result at its corresponding position.
                                int i = 0;
                                while(word[i])
                                {
                                        result[word_position + i] = word[i];
                                        ++i;
                                }
                }
    
                word = strtok(NULL, " .,");
        }
    
    
        cout << "after : " << result << endl;
    
        return 0;
    }
    

    Выход:

    abcd 345 pqrst 321
    3
    before: abcd 345 pqrst 321
    after : dabc 345 stpqr 321