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