1. 题目(17)求字符串长度(进阶版)
写一个Strlen函数,求字符串长度,除了函数的形参,函数中不能使用多余的变量。
2. 解题思路
既然题目说函数中不能再创建新的变量,那就不创建,我们可以使用递归来解决
- 编写一个函数Strlen,判断字符串的每个字符
- 如果该字符不是’\0’,那就返回一加上该字符被Strlen调用后的结果
3. 代码
#include<stdio.h>
int Strlen(char* str)
{
if (*str == '\0')
return 0;
else
{
return Strlen(str + 1) + 1;
}
}
int main()
{
char str[100] = { 0 };
gets(str);
printf("字符串的长度为:%d", Strlen(str));
return 0;
}
4. 题目(18)逆序字符串
输入一个字符串,写一个函数将一个字符串的内容逆序过来
5. 解题思路
定义两个字符串指针,分别指向字符串的第一个字符和最后一个字符,让这两个字符交换,之后让第一个指针向后走,指向第二个字符,让第二个指针向前走,指向倒数第二个字符,重复以上过程,直到两个指针相遇。
6. 代码
#include<stdio.h>
void reverse(char* arr)
{
char* head = arr;
char* last = head;
while (*last) {//让第二个指针指向字符串的最后一个字符
last++;
}
last--;//这里减1是因为不交换最后的\0
while (last > head) {
char tmp = *head;
*head = *last;
*last = tmp;
head++;//第一个指针向后走
last--;//第二个指针向前走
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);
reverse(arr);
puts(arr);
return 0;
}
在上述的reverse函数中,让第二个指针指向最后一个字符可以用strlen 来写
#include<stdio.h>
#include<string.h>
void reverse(char* arr)
{
//while (*last) {//让第二个指针指向字符串的最后一个字符
// last++;
//}
//last--;//这里减1是因为不交换最后的\0
char* last = arr + strlen(arr) -1 ;
//以上的代码可以用这个来替换
char* head = arr;
while (last > head) {
char tmp = *head;
*head = *last;
*last = tmp;
head++;//第一个指针向后走
last--;//第二个指针向前走
}
}
int main()
{
char arr[100] = { 0 };
gets(arr);
reverse(arr);
puts(arr);
return 0;
}
7. 题目(19)求数字的每一位之和
输入一个整数n,求这个整数n的每一位之和,并打印
8. 解题思路
按照题意,假如 n=257 那么输出结果应该是 14 (2+5+7)
很容易想到,把n的每一位拿下来逐个相加就行了
现在问题来了,怎么把每一位拿下来呢?
答:我们可以用取模操作符 %
257 如何拿到个位的7 ?
让257%10就得到啦~
如何拿到十位的5?
让257/10%10
如何拿到百位的2?
让257/10/10%10
既然理论成立,开始实践~
9. 代码
#include<stdio.h>
int main()
{
int n = 0;//输入的数字
int sum = 0;//每一位之和
scanf("%d", &n);
while (n)
{
sum += n % 10;//把每一位拿下来
n /= 10;//让n除以10,以便于继续拿下一位
}
printf("它的每一位之和为:%d", sum);
return 0;
}
10. 题目(20)判断回文字符串
输入一个字符串,判断这个字符串是否是回文字符串,如果是则输出Yes,如果不是则输出No
先解释一下什么是回文字符串,他指的是一个字符串正着读和倒着读都一样,比如说:asddsa
11. 解题思路
这道题与逆序字符串有点相似
定义两个字符串指针,让这两个指针分别指向字符串的第一个字符和最后一个字符。接着判断两个指针指向的字符是否相等,如果相等,让第一个指针向后走,第二个向前走。重复以上过程,直到两个指针相遇或者两个指针指向的字符不相等
12. 代码
#include<stdio.h>
#include<string.h>
int is_palindromic_strings(char arr[])
{
char* p1 = arr;
char* p2 = arr + strlen(arr) -1;
while (p1 < p2)//
{
if (*p1 == *p2)
//如果两个指针指向的字符相等就继续走
{
p1++;//p1向后走
p2--;//p2向前走
}
else
//如果两个指针指向的字符不相等就跳出循环
break;
}
if (p1 < p2)//循环异常终止
return 0;
return 1;//循环正常终止
}
int main()
{
char arr[100] = { 0 };
gets(arr);
if (is_palindromic_strings(arr))
printf("Yes");
else
printf("No");
return 0;
}
其实以上的代码还可以再优化一下
#include<stdio.h>
#include<string.h>
int is_palindromic_strings(char arr[])
{
char* p1 = arr;
char* p2 = arr + strlen(arr) -1;
while (p1 < p2)
{
if (*p1 == *p2)//如果两个指针指向的字符相等就继续走
{
p1++;//p1向后走
p2--;//p2向前走
}
else//如果两个指针指向的字符不相等就跳出函数
return 0;
}
return 1;//循环正常终止
}
int main()
{
char arr[100] = { 0 };
gets(arr);
if (is_palindromic_strings(arr))
printf("Yes");
else
printf("No");
return 0;
}