目录
问题描述
•连续输入字符串,请按长度为8拆分每个输入字符串并进行输出;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(每个字符串长度小于等于100)
输出描述:
依次输出所有分割后的长度为8的新字符串
解题分析
对于这道题,难点在于如何把字符串分割开来,同时还要判断是否长度小于8
我们可以采用递归的方法,每一次递归中值打印字符串前八个字符,同时把字符串中第九个字符的位置传给下一个递归函数,直到字符串的末尾
当我们写递归函数是必须要注意两点:1、递归结束条件 2、把问题分解成为规模更小的、具有与原问题有着相同解法的问题
接下来让我们开始写递归函数,因为我们要把字符串的首元素地址传递过去,所以要用字符指针接收且返回值类型为void(我们只需要打印就行了,所以不需要接收返回值)。
首先我们要先定义递归的结束条件,当函数接收的地址解引用后发现是'\0'时就直接return 结束本次递归。
第二步因为我们要打印长度为8的字符串,所以我们要用strlen函数判断字符串长度的大小。如果比8大,那就把while八次,每次打印字符并对字符地址++。如果比8小,那就以解引指针为条件(字符串结尾有'\0',‘\0’判断为假),while循环每次循环都打印字符串,然后根据字符大小补充0。
第三步就是递归了,这时就把中字符串的前八个字符打印了出来,或者总字符已经打印完。接下来就是把字符指针继续传递给该函数一直进行判断,直到指针指向'\0'为止。
下面图示过程
代码实现
#include<stdio.h>
#include<string.h>
void print(char* ret)
{
if (*ret == '\0')
{
return ;
}
int len = strlen(ret);
if (len > 8)
{
int i = 8;
while (i)
{
printf("%c", *ret);
ret++;
i--;
}
printf("\n");
}
else {
while (*ret != '\0')
{
printf("%c", *ret);
ret++;
}
for (int i = 0; i < 8 - len; i++)
{
printf("0");
}
}
print(ret);
}
int main()
{
char str[100] = { 0 };
scanf("%s", str);
print(str);
return 0;
}