将char数组拆分到其他数组中以便稍后使用它并忽略数字c ++

时间:2017-01-17 08:40:19

标签: c++ arrays char strtok

所以我有这个赋值,你需要通过给定数量的重新定位来重新定位char数组中的字母。最后一封信必须成为第一封信。例如:

  

输入:你好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 个答案:

答案 0 :(得分:0)

使用std::string代替C风格的字符串

要从字符串中删除数字,请使用std::remove_if中的<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());

答案 1 :(得分:0)

我做了你的功课。 不知道你是否熟悉所有这些代码。 我还重写了你的重新定位代码。看起来很乱...... 有一次我的偏爱。尝试从中学到一些东西。

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

答案 2 :(得分:0)

//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