数値のリストと正の整数 k が与えられると、リストの要素を一度に k 項目ずつ逆にする必要があります。要素の数が k の倍数でない場合、最後の残りの項目はそのままにしておく必要があります。
例: 入力: 1,2,3,4,5;2
出力: 2,1,4,3,5
私は非常に単純な概念を使用しました。2 つの端で a&b の 2 つのポインターを取り、それらをループ全体で繰り返します。
セグメンテーション違反が発生しています。どのように修正すればよいですか?
私のコード:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reverse(char str[],int p)
{
int i,j,k,a,b;
int len=strlen(str);
printf("%d\n",len);
a=0;
b=p-1;
while(1)
{
i=a;j=b;
while(j>i)
{
k=str[i];
str[i]=str[j];
str[j]=k;
i++;
j--;
}
a=a+p;
b=b+p;
if(b>=len)
break;
}
for(i=0;i<len-1;i++)
printf("%c,",str[i]);
if(i==len-1)
printf("%c",str[i]);
printf("\n");
}
int main(int argc,char* argv[])
{
if(argc!=2)
{
printf("Wrong number of arguments\n");
exit(0);
}
FILE *fp;
fp=fopen(argv[1],"r");
if(fp==NULL)
{
printf("File can't be openend:\n");
exit(0);
}
char c;
c=fgetc(fp);
char str[100];
memset(str,'0',100);
int k,i;
while(1)
{
k=0;
while(c!=';')
{
if(c!=',')
{
str[k]=c;
k++;
c=fgetc(fp);
}
else
c=fgetc(fp);
}
str[k]='\0';
c=fgetc(fp);
int p=c-'0';
reverse(str,p);
c=fgetc(fp);
if(c==EOF)
break;
else
c=fgetc(fp);
}
return 0;
}
ありがとう!