慢慢地,对指针的理解也深入了一些,这次的作业没事先参考答案,感觉很有成就感。
原题目是C语言程序设计书上第8.7练习题,我稍微改了一些,让这个程序更加通用。
题目:将字符串b的部分连续字符复制到字符串a的指定位置并覆盖,输出字符串a。参与替换与被替换的起始位置由用户指定,如果输入的位数不对,则提醒用户重新输入。如果参与替换的字符多于被替换的字符,则舍去多余部分(不舍掉的功能现在懒得做);如果参与替换的字符少于被替换的字符,则将字符串a多出来的字符删掉,后面的字符前移。
其中判断输入起始位置是否正确并让用户重新输入的功能,因为没想起来更好而且简单的方法,就直接用了goto语句,我知道这样不好,不过在这里用一下应该没什么事吧。
#include<stdio.h>
#include<string.h>
void myStrCpy(char *myStringA, char *myStringB, int mA, int mB, int nA, int nB);
int main()
{
int mA = 0, mB = 0, nA = 0, nB = 0;
char myStringA[100];
char myStringB[100];
printf_s("请输入字符串a:\n");
//scanf_s("%s", myStringA,99);
gets_s(myStringA, 99);
printf_s("请输入字符串b:\n");
gets_s(myStringB, 99);
//scanf_s("%s", myStringB,99);
A: printf_s("字符串a的第几位到第几位将被替换?\n");
scanf_s("%d,%d", &mA, &nA);
if (mA >= nA)
{
printf_s("错误的位数。\n");
goto A;
}
B: printf_s("字符串b的第几位到第几位将参与替换?\n");
scanf_s("%d,%d", &mB, &nB);
if (mB >= nB)
{
printf_s("错误的位数。\n");
goto B;
}
myStrCpy(myStringA, myStringB, mA, mB, nA, nB);
printf_s("%s", myStringA);
return 0;
}
void myStrCpy(char *myStringA, char *myStringB, int mA, int mB, int nA, int nB)
{
char *pA, *pB, *pX;
int t = 0;
int lengthA = 0;
lengthA = strlen(myStringA);
pA = myStringA + mA - 1;
pB = myStringB + mB - 1;
pX = myStringA + nA;
char myStringC[100];
for (int i = 0;pB < myStringB + nB + 1;pB++, i++)
{
myStringC[i] = *pB;
t = i;
}
for (int i = 0;i <= (nA - mA);pA++)
{
*pA = myStringC[i];
i++;
if (i >= (t + 1) && (nA - mA)>(nB - mB)) //如果字符串全部复制完成,而字符串a仍有需要替换却没被覆盖掉的字符,则把这些字符删掉
{
for (int j = 0;j < lengthA - nA + 1;j++)
{
*(pX - ((nA - mA) - (nB - mB))) = *pX;
pX++;
}
break;
}
}
}