Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将字母向右或向左移动?_C - Fatal编程技术网

C 如何将字母向右或向左移动?

C 如何将字母向右或向左移动?,c,C,我收到一个带有字符串的文件,例如“美国成立于*1776*”。我搞不懂的是如何将字母向左或向右移动一个空格,并将字母环绕。我能把字母从a移到b,但不能改变它在单词中的位置。 该输出的示例如下: "heT nitedU tatesS asw oundedf ni 1776**" 在C语言中,字符串作为字符数组存储在内存中。与C++向量不同,不能插入或删除数组中的元素,只能访问它们的值或更改它们的值。 如果按如下方式声明C字符串: char *myStr = "Fred"; 它将作为五个字符的数组

我收到一个带有字符串的文件,例如
“美国成立于*1776*”
。我搞不懂的是如何将字母向左或向右移动一个空格,并将字母环绕。我能把字母从a移到b,但不能改变它在单词中的位置。 该输出的示例如下:

"heT
nitedU
tatesS
asw
oundedf
ni
1776**"

在C语言中,字符串作为字符数组存储在内存中。与C++向量不同,不能插入或删除数组中的元素,只能访问它们的值或更改它们的值。 如果按如下方式声明C字符串:

char *myStr = "Fred";
它将作为五个字符的数组存储在内存中,第五个字符是终止C字符串的零值:

myStr[0] = 'F'
myStr[1] = 'r'
myStr[2] = 'e'
myStr[3] = 'd'
myStr[4] =  0
您需要为循环设计一个
,将每个数组元素复制到前面的元素,同时记住需要保存要覆盖的元素。在此示例中,它应导致执行以下复制操作:

len      = strlen(myStr);
saveCh   = myStr[0];
myStr[0] = myStr[1]; 
myStr[1] = myStr[2];
myStr[2] = myStr[3];
myStr[3] = saveCh;
因此,现在您的工作是为
创建一个循环,该循环对任意长度的C字符串执行该操作

因此,要将C字符串中的字符向左旋转,需要将数组中索引i处的每个字符复制到前面的数组元素i-1。棘手的部分是在i=0时正确处理环绕(在本例中,您希望将
myStr[0]
复制到
myStr[3]
。现在使用
for
循环来完成这一操作

您还需要了解,任何C字符串的最后一个字符都是null字符(值为零),用于终止C字符串。如果修改数组中的该元素,则字符串将中断。这就是为什么
saveCh
会复制到
myStr[3]
而不是
myStr[4]

void rotateStrLeftOneChar(char *myStr) {
   // Always check for error and special cases first!
   // If myStr is a NULL pointer, do nothing and exit
   // If myStr is less than 2 chars, nothing needs to be done too.
   if ((myStr != NULL) && (strlen(myStr)>1)) {
      int  len    = strlen(myStr);
      char saveCh = myStr[0];
      int  i      = 0;

      // Copy each char at index i+1 left to index i in the array
      for(i=0; i<len-2; i++)
         myStr[i] = myStr[i+1];

      // The last character is special and is set to saveCh
      myStr[len-1] = saveCh;
     }
  }
void rotatestLeftOneChar(char*myStr){
//始终首先检查错误和特殊情况!
//如果myStr是空指针,则不执行任何操作并退出
//如果myStr小于2个字符,则无需执行任何操作。
如果((myStr!=NULL)&&(strlen(myStr)>1)){
int len=strlen(myStr);
char saveCh=myStr[0];
int i=0;
//将索引i+1左侧的每个字符复制到数组中的索引i

对于(i=0;i如果您只需要输出字母以向左移动,并且不想更改原始输入,则可以执行以下操作:

#include <stdio.h>
#include <string.h>

void shiftletters(char * input, int i);

int main () {

    char input[256];
    int shift;

    printf("Enter input : ");
    scanf("%[^\n]s", input);

    printf("Number of shifts : ");
    scanf("%d", &shift);

    shiftletters(input, shift);

    return 0;
}

void shiftletters(char * input, int numshifts)
{
    char str[256] = {'\0'};
    char * delim = " \t";
    char * pch = NULL;
    int j, k, len, shifts;

    if (input == NULL)
    {
        printf ("Invalid input\n");
        return;
    }

    strcpy (str, input);
    pch = strtok (str, delim);
    while (pch != NULL)
    {
        len = strlen (pch);
        if ((numshifts == len) || (len == 1))
        {
            printf ("%s\n", pch);
            pch = strtok (NULL, delim);
            continue;
        }

        if (len < numshifts)
            shifts = numshifts % len;
        else
            shifts = numshifts;

        for(j=shifts; j<len; j++)
            printf("%c", pch[j]);

        for(k=0; k<shifts; k++)
            printf("%c", pch[k]);

        printf("\n");
        pch = strtok (NULL, delim);
    }
}
像这样

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

enum { L = -1, R = 1};

char *rotate(char word[], int dir){
    size_t len = strlen(word);
    char *temp = malloc(len + 1);
    if(!temp){
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    strcpy(temp, word);
    for(char *src = temp; *src; ++src, ++dir){//or use memmove
        word[(dir+len)%len] = *src;
    }
    free(temp);
    return word;
}

int main(int argc, char *argv[]) {
    FILE *fp = fopen("data.txt", "r");
    if(fp == NULL){
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    if(argc < 2){
        fprintf(stderr, "Usage %s L|R...\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    char word[64];
    while(fscanf(fp, "%63s", word)==1){
        for(char *shift = argv[1]; *shift; ++shift){
            int dir = *shift == 'L' ? L : R;
            rotate(word, dir);
        }
        printf("%s\n", word);
    }
    fclose(fp);
}
#包括
#包括
#包括
枚举{L=-1,R=1};
字符*旋转(字符字[],int-dir){
尺寸长度=标准长度(字);
char*temp=malloc(len+1);
如果(!temp){
佩罗尔(“马洛克”);
退出(退出失败);
}
strcpy(temp,word);
对于(char*src=temp;*src;++src,++dir){//或使用memmove
字[(dir+len)%len]=*src;
}
免费(临时);
返回词;
}
int main(int argc,char*argv[]){
文件*fp=fopen(“data.txt”,“r”);
如果(fp==NULL){
佩罗尔(“福彭”);
退出(退出失败);
}
如果(argc<2){
fprintf(标准,“用法%s L|R...n”,argv[0]);
退出(退出失败);
}
字符字[64];
而(fscanf(fp,“%63s”,word)==1){
对于(char*shift=argv[1];*shift;++shift){
int dir=*shift='L'?L:R;
旋转(字,方向);
}
printf(“%s\n”,word);
}
fclose(fp);
}

使用memmove版本

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

enum { L = -1, R = 1};

char *rotate1(char word[], int dir){
    size_t len = strlen(word);
    if(len > 2){
        char temp;
        if(dir == L){
            temp = word[0];
            memmove(word, word+1, len-1);
            word[len-1] = temp;
        } else if(dir == R){
            temp = word[len-1];
            memmove(word+1, word, len-1);
            word[0] = temp;
        }
    }
    return word;
}

int main(int argc, char *argv[]) {
    FILE *fp = fopen("data.txt", "r");
    if(fp == NULL){
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    if(argc < 2){
        fprintf(stderr, "Usage %s L|R...\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    char word[64];
    while(fscanf(fp, "%63s", word)==1){
        for(char *shift = argv[1]; *shift; ++shift){
            int dir = *shift == 'L' ? L : R;
            rotate1(word, dir);
        }
        printf("%s\n", word);
    }
}
#包括
#包括
#包括
枚举{L=-1,R=1};
char*rotate1(char-word[],int-dir){
尺寸长度=标准长度(字);
如果(len>2){
焦炭温度;
if(dir==L){
temp=字[0];
memmove(word,word+1,len-1);
字[len-1]=温度;
}else if(dir==R){
temp=字[len-1];
memmove(word+1,word,len-1);
字[0]=温度;
}
}
返回词;
}
int main(int argc,char*argv[]){
文件*fp=fopen(“data.txt”,“r”);
如果(fp==NULL){
佩罗尔(“福彭”);
退出(退出失败);
}
如果(argc<2){
fprintf(标准,“用法%s L|R...n”,argv[0]);
退出(退出失败);
}
字符字[64];
而(fscanf(fp,“%63s”,word)==1){
对于(char*shift=argv[1];*shift;++shift){
int dir=*shift='L'?L:R;
旋转1(字,方向);
}
printf(“%s\n”,word);
}
}

与手动操作完全相同。您将如何手动操作?想象一个包含6个部分的框,每个部分都包含
nitedU
字母。您将如何重新排列这些部分?注意,以这种方式输出比在程序内存中以这种方式移动字符更容易。您需要什么?@zerkms,如果我理解的话正确回答你的问题,你只要把信转到left@aschepler我需要让它将字母输出到左边的一个位置,而不是实际的程序位置。@RollTide1234如果只需要输出它-读取最后一个字母,然后读取除最后一个以外的所有字母。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

enum { L = -1, R = 1};

char *rotate1(char word[], int dir){
    size_t len = strlen(word);
    if(len > 2){
        char temp;
        if(dir == L){
            temp = word[0];
            memmove(word, word+1, len-1);
            word[len-1] = temp;
        } else if(dir == R){
            temp = word[len-1];
            memmove(word+1, word, len-1);
            word[0] = temp;
        }
    }
    return word;
}

int main(int argc, char *argv[]) {
    FILE *fp = fopen("data.txt", "r");
    if(fp == NULL){
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    if(argc < 2){
        fprintf(stderr, "Usage %s L|R...\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    char word[64];
    while(fscanf(fp, "%63s", word)==1){
        for(char *shift = argv[1]; *shift; ++shift){
            int dir = *shift == 'L' ? L : R;
            rotate1(word, dir);
        }
        printf("%s\n", word);
    }
}