从整型数组进入字符串数组了,理解难度上加大了一些,不过也不是太难,基本上搞懂概念就行,要背的地方也有不少下面是总结了一写概念的脑图:
必不可少的练习:
1.字符串逆置
本题的意思是将字符串倒过来,如xzg逆置为gzx,思路是设置2个移动下标,left和right,循环一次left++;right--;,通过while循环每次将a[left]与a[right]进行交换,循环条件为left<right。下面是代码:
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a[]="hellodsadwddwd";
int n = sizeof(a) - 1;
int left = 0;
int right = n - 1;
while(left < right){
char c = a[left];
a[left] = a[right];
a[right] = c;
left ++;
right --;
}
puts(a);
return 0;
}
结果为:
2.计算单词的个数
这题的关键在于空格的判断,当从一个单词→空格时,进行一个记录值的++,下面是代码:
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a[]="hello x z g m";
int n = sizeof(a) - 1;
int count = 0;
for(int i = 0; i < n; i ++){
if((a[i] != ' ' && a[i+1] == ' ')
|| (a[i] != ' ' && a[i+1] == '\0')){
count ++;
}
}
printf("单词个数是%d\n",count);
return 0;
}
结果如下:
3.实现字符串移动
>char a[]="SDsd13@#$GGty^556"
>输出结果是:sdggSDTY13556@#$^
>输出数字的和
>计算特殊字符的个数
这题的思路是用另一个字符串数组去记录移动后的数组,我的想法是先从大写开始进行一次循环,再从小写进行一次循环,然后是数字字符,最后是特殊字符。这个代码判断比较复杂下面是代码实现:
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a[]="SDsd13@#$GGty^556";
//sdggSDTY13556@#$^
int n = sizeof(a) - 1;
char b[n];
int count=0;
int sum = 0;
int type = 0;
for(int i = 0; i < 4; i ++){
for(int j = 0;j < n; j ++){
if(i == 0 && (a[j] >= 'A' && a[j] <= 'Z')){
b[count] = a[j] + 32;
count ++;
}
if(i == 1 && (a[j] >= 'a' && a[j] <= 'z')){
b[count] = a[j] - 32;
count ++;
}
if(i == 2 && (a[j] >= '0' && a[j] <= '9')){
b[count] = a[j];
sum += a[j] - '0';
count ++;
}
if(i == 3 && !(a[j] >= 'A' && a[j] <= 'Z')
&& !(a[j] >= 'a' && a[j] <= 'z')
&& !(a[j] >= '0' && a[j] <= '9')){
b[count] = a[j];
type ++;
count ++;
}
}
}
b[count] = '\0';
printf("变换后的字符串%s,和为%d,个数%d\n",b,sum,type);
return 0;
}
结果如下:
4.实现单词的逆置
>char a[]="hello my student"
>输出:student my hello
这题的思路是先将整体逆置,然后在进行单个单词的逆置,下面是代码:
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a[]="hello my student";
int n = sizeof(a) - 1;
int left = 0;
int right = n - 1;
while(left < right){
char c = a[left];
a[left] = a[right];
a[right] = c;
left ++;
right --;
}
int left2 = 0;
int right2 = 0;
int type = 0;
for(int i = 0; i < n; i ++){
if(type == 0 && (a[i] == ' ' || i == n - 1)){
right2 = i - 1;
if(i == n-1){
right2 = n - 1;
}
type = 1;
int left3 = left2;
int right3 = right2;
while(left3 < right3){
char d = a[left3];
a[left3] = a[right3];
a[right3] = d;
left3 ++;
right3 --;
}
}
if(type == 1 && a[i] != ' '){
left2 = i;
type = 0;
}
}
puts(a);
return 0;
}
结果如下:
5.计算字符串中空格的个数
这题没什么好说的,一个循环记录空格个数,下面是代码:
#include <stdio.h>
int main(int argc, const char *argv[])
{
//计算字符串中空格的个数
char a[] = "sddw dawdwdf d awda ss sadwd ";
int n = sizeof(a) - 1;
int type = 0;
for(int i = 0; i < n; i ++){
if(a[i] == ' '){
type ++;
}
}
printf("字符串的空格数为%d\n",type);
return 0;
}
结果如下:
6.计算字符串中is的个数
用单次循环,判断a[i]='i'&&a[i+1]='s'即可。代码如下:
#include <stdio.h>
int main(int argc, const char *argv[])
{
//计算字符串中is的个数
char a[] = "islfidjgis knvois";
int n = sizeof(a) - 1;
int type = 0;
for(int i = 0; i < n ; i ++){
if(a[i] == 'i' && a[i+1] == 's'){
type ++;
}
}
printf("is一共有%d个\n",type);
return 0;
}
结果如下:
7.字符串匹配
这题的思路是循环主串,然后在主串上进行子串循环,同时用type值记录相等的个数,若type一次子串循环后的值等于子串的长度,那么就输出主串这时候的i值,即为子串第一次出现的下标值。下面是代码:
#include <stdio.h>
int main(int argc, const char *argv[])
{
//字符串的匹配
char a[] = "ababcabcdabcde";
char b[] = "abcd";
int n = sizeof(a) - 1;
int m = sizeof(b) - 1;
for(int i = 0; i < n; i ++){
int type = 0;
for(int j = 0; j < m; j ++){
if(a[i+j] == b[j] && i + j < n)
type ++;
}
if(type == m){
printf("子串在主串的下标%d出现\n",i);
break;
}
}
return 0;
}
结果如下:
8.判断字符串是否是回文字符串
回文字符串,这比之前判断回文数字简单多了,因为我们多学习了数组,可以用第一题的同样思想,只不过这次不用进行交换罢了,只需要进行比较,若不同则不是回文字符串。下面是代码:
#include <stdio.h>
int main(int argc, const char *argv[])
{
//回文字符串
printf("请输入字符串位数n:\n");
int n;
scanf("%d",&n);
getchar();
char a[n];
printf("请输入字符串\n");
scanf("%s",a);
getchar();
int left = 0;
int right = n - 1;
int type = 0;
while(left < right){
if(a[left] != a[right]){
type ++;
}
if(type != 0){
printf("不是回文字符串\n");
return 0;
}
left ++;
right --;
}
printf("是回文字符串\n");
return 0;
}
结果如下:
9.实现字符串排序
本题我使用了冒泡排序,代码如下:
#include <stdio.h>
int main(int argc, const char *argv[])
{
//字符串排序
char arr[10];
printf("请输入10位字符串\n");
scanf("%s",arr);
getchar();
int n = 10;
while(n > 0){
int type = 0;
for(int i = 0; i < n - 1; i ++){
if(arr[i] > arr[i + 1]){
char c = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = c;
type ++;
}
}
if(type == 0){
break;
}
n --;
}
printf("排序后的字符串为:\n%s\n",arr);
return 0;
}
结果如下:
10.删除字符串中的空格
简单的字符串平移操作,代码如下:
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a[] = "sdas sadwds sdwsad w ";
int n = sizeof(a) - 1;
int count = 0;
for(int i = 0; i < n ; i ++){
if(a[i] != ' '){
a[count ++] = a[i];
}
}
a[count] = '\0';
puts(a);
return 0;
}
结果如下: