如何将给定数字索引留下的数组(或c-string)元素移位

时间:2014-11-04 21:05:45

标签: c++ visual-studio-2012

我正在编写一个函数来将我的c字符串的字符移位给定数量的字符。目前该功能将移动角色,但我失去一个。我知道这是我的for循环的某种索引问题,但我不能把它固定下来。

编辑:左移我的意思是:

给出a,b,c,d的起始c-string 如果向左移动一个索引,则该相同的数组将等于b,c,d,a 如果向左移动两个索引,则相同的c-string将等于c,d,a,b

到目前为止,这是我的代码:

#include <iostream>
using namespace std;

void shiftleft (char myarray[], int size, int shiftBy)
{

char temp;

for (int i=size-1; i > 0; i--)
{
    temp = myarray[size+shiftBy];
    myarray[size+shiftBy] = myarray[i];
    myarray[i] = temp;
}


}

int main() {
    char myarray[20] = "test";
    int size = 4;
    shiftleft (myarray, size, 1);

    for(int i = 0; i < size+1; i++){
    cout << myarray[i];
    }


    return 0;
}

这是我的工作函数,它将每个元素向右移动,我需要做的就是反转这个循环,并向左移动元素,如下所示:&lt; ----

//function bloack
void shiftright (char myarray[], int size, int shiftBy)
{
    if(shiftBy > size){
        shiftBy = shiftBy - size;
    }
    if(size == 1){
        //do nothing
    }
    else{
        char temp;
        //for loop to print the array with indexes moved up (to the right) --> by 2
        for (int i=0; i < size; i++)
        {
            temp = myarray[size-shiftBy];
            myarray[size-shiftBy] = myarray[i];
            myarray[i] = temp;
        }

    }
}

3 个答案:

答案 0 :(得分:1)

随着一点点狂热,我能够让它发挥作用。这是我的功能:)

问题在于我需要将元素i分配给i + shiftBy,并且只在i&lt;尺寸shiftBy。

//function bloack
void shiftLeft (char myarray[], int size, int shiftBy)
{
    if(shiftBy > size){
        shiftBy = shiftBy - size;
    }

    if(size == 1){
        //do nothing
    }
    else{
        char temp;
        //for loop to print the array with indexes moved up (to the left) <-- by 2
        for (int i=0; i < size-shiftBy; i++)
        {//EXAMPLE shift by 3  for a c-string of 5
            temp = myarray[i];//temp = myarray[0]
            myarray[i] = myarray[i + shiftBy];//myarray[0] == myarray[2]
            myarray[i + shiftBy] = temp;//myarray[2] = temp(value previously at index i)
        }

    }
}

答案 1 :(得分:0)

如果您想将换档字符串向左移动而不旋转,则可以使用以下代码:

void shiftLeft (char *string,int shiftLength)
{

int i,size=strlen(string);
if(shiftLength >= size){
    memset(string,'\0',size);
    return;
}

for (i=0; i < size-shiftLength; i++){
    string[i] = string[i + shiftLength];
    string[i + shiftLength] = '\0';
}

}

答案 2 :(得分:0)

//假设j是你的班次

char* name = strdup("Hello");
char* str_ptr = (char*) malloc(sizeof(char));  
strcpy(str_ptr, name);
int j = 3 // len of shift
for(int i = 0; i < strlen(str_ptr); i++){
  printf("%c", str_ptr[(i+j)%strlen(str_ptr)]);
}