10-3. 文字列の逆順(15)
文字列を入力し、その文字列を反転し、反転した文字列を出力します。
入力形式:
入力では、1 行に 80 文字以下の長さの空でない文字列が入力され、キャリッジ リターンで終了します。
出力フォーマット:
反転した文字列を1行で出力します。
入力サンプル:
#include<stdio.h>
#include<string.h>
char s[81];
int main(void)
{
gets(s);
char *p=s;
while(*(p+1)!='\0')//挪到最后一位
{
p ++;
}
//挨个打印
while(1)
{
printf("%c",*p);
p --;
if(p==s)
{
printf("%c",*p);
break;
}
}
}
10-4. 文字列の左回転(20)
文字列と非負の整数 N を入力すると、文字列を左に N 回循環シフトする必要があります。
入力形式:
入力は、行 1 で長さが 100 文字以下の空でない文字列として指定され、復帰で終了します。行 2 では、負でない整数 N として指定されます。
出力フォーマット:
N回左回転した文字列を1行に出力します。
入力サンプル:
#include<stdio.h>
#include<string.h>
char s[101];
int main(void)
{
//控制台输入 s和 N
gets(s);
int n;
scanf("%d",&n);
int i,k;
char s1[101];
strcpy(s1,s);//s1=strcpy(s1,s) 会报错!!
//分割 前面 he
{
char *p=s1;
p[n]='\0';
printf("此时s1=%s\n",s1);
}
//分割 后半段
{
char *q=s;
k=strlen(s);
for(i=0;i<=k-n;i++)
{
q[i]=q[i+n];
}
q[i]='\0';
printf("此时s=%s\n",s);
}
//连接
strcat(s,s1);
printf("最后s=%s\n",s);
}
文字列を左にシフト
k=strlen(s);
for(i=0;i<=k-n;i++)
{
q[i]=q[i+n];
}
q[i]='\0';
別の方法
#include <stdio.h>
#include <string.h>
char str[103];
int main()
{
int i, k, n;
gets(str);
k = strlen(str);
scanf("%d", &n);
if ( n % k == 0 )
puts(str);
else
{
for ( i=n%k; i<k; i++ )//i=2%12 i=2 从第二位开始打印
{
printf("%c", str[i]);
}
for ( i=0; i<n%k; i++ )
{
printf("%c", str[i]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
#include <string.h>
char str[103];
int main()
{
int i, k, n;
gets(str);
k = strlen(str);
scanf("%d", &n);
if ( n % k == 0 )
puts(str);
else
{
for ( i=n; i<k; i++ )//如果等于k 打印就会一直有一个空格
//打印到k-1 就对了
{
printf("%c", str[i]);
}
for ( i=0; i<n; i++ )//如果等于n 打印会多打印一位
{
printf("%c", str[i]);
}
printf("\n");
}
return 0;
}