c语言 如何将一个字符串的前n个字母后移至尾,其他的按顺序前移?

主要是逻辑表达式,我的写成这样,但只出现了前移的,前面几个字母不见了!
int i,j,k; char temp;

for(j=0;j<m;j++)
{temp=w[j];
for(i=0,k=0;i<=N-1,k<=N-2;i++,k++)

w[k]=w[i+1];
w[N-1]=temp;
}
还有另外的两种逻辑我也试过了!
比如:本来是abcdefghijk,我输入一个3之后就变成了defghijkabc.
我要的 是这个结果!前面那种我也做的出来!

#include <stdio.h>
#include <string.h>//为了使用memcpy、strlen等字符串函数
#define N 5
int main()
{
char a[] = "abcdefghijk";
int i, j, m;
char b[N+1] = {'\0'};//b将成为一个中间储存数组
memcpy(b, a, N);//把a的前N个字符复制到b中,存起来,以供后面使用
m = strlen(a)+1;//得出a数组的长度
for(i=0,j=N; j<m; i++,j++)
{
a[i] = a[j];//前N个字符之后的字符“按顺序前移”
}
strcat(a, b);//把b追加到a后面,达成“前n个字母后移至尾”
printf(a);
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-11-25
int i,j,k; char temp;
for(j=0;j<m;j++){
temp=w[j];//此处有误,每次循环时j都比之前+1,但是按你的逻辑此处应该是首字母
for(i=0,k=0;i<=N-1,k<=N-2;i++,k++)
w[k]=w[i+1];

w[N-1]=temp;
}
你的逻辑是这样:
假如字符串是abcdefgh,要将前三个字母移至末尾,则要经过
1.bcdefgha,在这一步,也就是temp=w[0];
for(i=0,k=0;i<=N-1,k<=N-2;i++,k++)
w[k]=w[i+1];
所达到的;
2.第二步进行之前,字符串是bcdefgha,要将b后移,显然应该将b存成temp,b后面的前移,
所以第二步依然是
temp=w[0];
for(i=0,k=0;i<=N-1,k<=N-2;i++,k++)
w[k]=w[i+1];
以达到
cdefghab;
3,同样把c暂存,c后面前移,则获得最后要得到的字符串defghabc。
所以只需要把我在程序中标出的语句改了就可以运行了。

【另外:在
for(i=0,k=0;i<=N-1,k<=N-2;i++,k++)
w[k]=w[i+1];
此处其实k和i的作用一样,没有必要用两个变量,可合二为一:
for(i=0;i<=N-1,k<=N-2;i++)
w[i]=w[i+1];追问

我暗号你写的写成这样子:
int i,k,temp=w[0],j;for(j=0;j<m;j++)
{
for(i=0,k=0;i<N-1,k<=N-2;i++,k++)
{
w[k]=w[k+1];
w[N-1]=temp;

for(i=0,k=0;i<=N-1,k<=N-2;i++,k++) {
temp=w[0];
w[k]=w[k+1];
w[N-1]=temp;
}
}
}

还是没有改变啊!

追答

int i,j,k; char temp;
for(j=0;j<m;j++){
temp=w[j];//此处有误,每次循环时j都比之前+1,但是按你的逻辑此处应该是首字母
for(i=0,k=0;i<=N-1,k<=N-2;i++,k++)
w[k]=w[i+1];
w[N-1]=temp;
}
就应该是
int i,j,k; char temp;
for(j=0;j<m;j++){
temp=w[0];
for(i=0,k=0;i<=N-1,k<=N-2;i++,k++)
w[k]=w[i+1];
w[N-1]=temp;
}

本回答被提问者采纳
第2个回答  2013-03-20
(1)按你的逻辑
int len = strlen(w);
for (i=0;i<m;i++) {
temp = w[0];
for (j=0;j<len-1;j++) w[j] = w[j+1];
w[len] = temp;
}

(2)char a[100],b[100];
strncpy(a,w,m);
strncpy(w,w[m+1],len-m);
strncpy(w[m+1],a,m);本回答被网友采纳
第3个回答  2013-03-20
#include <iostream>
using namespace std;
int main()
{
char buf[32]={0};
cin >> buf;
int len = strlen(buf);
int n ;
cin >> n;
char* p = buf;
char* q = p+len;
for(int i=0;i<n;i++)
{
*(q++)=*(p++);
}
q=p;
*(--q)='\0';
cout << p ;
}
是不是要这样子?

c语言 如何将一个字符串的前n个字母后移至尾,其他的按顺序前移?
j=N; j<m; i++,j++)\\r\\n {\\r\\n a[i] = a[j];\/\/前N个字符之后的字符“按顺序前移”\\r\\n }\\r\\n strcat(a, b);\/\/把b追加到a后面,达成“前n个字母后移至尾”\\r\\n printf(a);\\r\\n return

c语言 如何将一个字符串的前n个字母后移至尾,其他的按顺序前移?
m = strlen(a)+1;\/\/得出a数组的长度 for(i=0,j=N; j<m; i++,j++){ a[i] = a[j];\/\/前N个字符之后的字符“按顺序前移”} strcat(a, b);\/\/把b追加到a后面,达成“前n个字母后移至尾”printf(a);return 0;}

c语言,从字符串中删除所有的换行符(换行符后面的字符前移)
首先,定义一个名为`removeNewlines`的函数,接受一个指向字符数组的指针。接下来,使用while循环遍历输入的字符串,当遇到换行符时跳过,将非换行符字符复制到新的位置。重要的是,每次复制后,确保保留字符串的原始长度,以便于在新字符串的末尾添加终止符`\\0`,确保字符串的正确终止。下面是一个简化后...

C语言:把一个长度为n的字符串中的字符依次后移m个位置,移出的字符移...
include<string.h> void move(char s[]){ int n=strlen(s),i;char a=s[n-1];for(i=n-1;i>0;i--)s[i]=s[i-1];s[0]=a;} int main(){ int n,m;char s[1000];puts("输入字符串和要移动的次数");scanf("%s%d",s,&m);\/\/输入样例abcde 2 while(m--){ move(s);}...

C语言:编写程序,把字符数组中的字母按由小到大 的顺序排列并输出
include <stdio.h>#include <stdlib.h>#include <string.h>int cmp(const void *a, const void *b) { return *(char*)a - *(char*)b; \/\/ 这里记住一定要用排序的元素类型的指针做强制装换并且再取指针指向的值。}int main() { char s[] = "kjferu21398dyfkaqpoia"; qs...

C语言:用TC编程:将一个字符串中的所有字符按相反的次序重新放置
include<string.h> define N 50 void main(){ char str[N];int i,j,temp;printf("\\n请输入一行字符:\\n");gets(str);\/*利用循环交换字符串中前后相对应的字符 for (i=0,j=(strlen(str)-1);i<j;i++,j--) \/\/strlen取字符串的长度,减1就是最后一个字符的下标 { \/*让字符串中...

C语言函数题,编写函数将输入字符串的前三个字母移到最后
void GetString(char s[]);\/*实现细节在此不表*\/ int main(){ char s[MAXS];GetString(s);Shift(s);printf("%s\\n",s);return 0;} \/*你的代码将被嵌在这里*\/ 代码:void Shift(char s[]){ int len=strlen(s);if(len==3);else { int i;char str[100];int t=0;for(i=0...

C语言 写一个函数使输入的一个字符串按反序存放
编写一个函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符。可以设置一个中间值,让两端的字符相交换,然后前头的向后移动一位,后头的向前移动一位。当前头的变量大于中间值时。程序停止执行。根据此原理编写代码如下:include<stdio.h> define N 100 void inverse(char[]);int main(...

用C语言编程:将数组st中前半部分连续的“*”移到st 的尾部,其它位置上...
\/\/ 而且一个字符一个字符移动也不好 include <stdio.h> include <string.h> \/\/ 先数'*'再移动比较好 void f(char *st){ int i;int len = strlen(st);for (i = 0; st[i] == '*'; ++i) \/\/ 数'*';strcpy(st, st + i); \/\/ 将后一部分移动到前面 \/\/ 以下复制前面连续的...

功能:将一个字符串中的前N个字符复制到一个字符数组中去,
int i,n;\/***SPACE***\/ gets(str1);scanf("%d",&n);\/***SPACE***\/ for (i=0; i<n ;i++)\/***SPACE***\/ str2[i]=str1[i];\/***SPACE***\/ str2[i]='\\0';printf("%s\\n",str2);}

相似回答