一、学习笔记:
1.可以直接将字符串或者字符串常量的首地址赋值给字符指针变量
但不能直接赋值给一个数组名,因为数组名是地址常量。
gets()对s1可以,对s2不行:自己的理解:s1是数组名,是数组的首地址,有明确的指向,gets实际上是对指针所指向的变量进行赋值(指针所指向的变量有存储空间)。而s2没有明确的指向,所以不能对他所指向的量进行赋值。
但是由于s2=(char*)malloc(10);
意思是:申请长度为10字节的连续存储空间,并将分配到的存储空间地址转换为char类型地址,然后把他赋给指针变量s2.
这时,s2就有明确的指向了(指向一个明确的存储空间了)
2.头文件<string.h>
strlen(str)字符串长度(不含'\0')
strcpy(str1,str2)字符串的复制
strcat(str1,str2)字符串的连接
strchr(str,ch)标准字符查找函数:正向在字符串str中查找字符ch,若ch存在则返回其在字符串中首次出现的地址,否则返回NULL。
strcmp(s1,s2)(strcompare)(str指string,chr指char)
strncmp(s1,s2,n):比较字符串前n个字符的标准函数。函数功能:比较str1和str2两个字符串的前n个字符是否相等,如果相等则返回0,否则返回非0。
3.gets()puts()都是在头文件stdio.h里面定义的
substr是子串的意思
二、简单测试
1.将字符串中小写字母变成大写
#include <stdio.h>
int main()
{
char string[100];
gets(string);
for (char *p = string; *p != '\0'; p++)
if (*p >= 'a' && *p <= 'z')
*p = *p - 32;
puts(string);
return 0;
}
- 判断字符串是否回文
#include <stdio.h>
#include <string.h>
int main()
{
char a[10];
gets(a);
char *head, *end;
head = a;
end = a - 1 + strlen(a);
int flag = 1;
for (; head < end; head++, end--)
if (*end != *head)
{
flag = 0;
break;
}
if (flag == 1)
printf("yes");
else
printf("no");
return 0;
}
3.字符串复制函数
#include <stdio.h>
#include <string.h>
void mystrcpy(char *m, char *n)
{
char *p = m;
for (; *n != '\0'; m++, n++)
{
*m = *n;
}
*m = '\0';
}
int main()
{
char a[20], b[20];
gets(a);
mystrcpy(b, a);
puts(b);
return 0;
}
4.将原字符串从指定位置拷贝到目标字符串
#include <stdio.h>
#include <string.h>
int main()
{
char a[20], b[20];
gets(a);
int x;
scanf("%d", &x);
strcpy(b, a + x);
puts(b);
return 0;
}
5.指针方式实现字符串连接
#include <stdio.h>
#include <string.h>
char *mystrcat(char *p, char *q)
{
char *x = p; //用一个指针变量来存放数组a的首地址
for (; *p != '\0'; p++)
;
for (; *q != '\0'; p++, q++)
*p = *q;
return x;
}
int main()
{
char a[100], b[20];
gets(a);
gets(b);
puts(mystrcat(a, b));
return 0;
}
6.字符串查找
#include <stdio.h>
#include <string.h>
char *mystrchr(char *m, char n)
{
for (; *m != '\0'; m++)
if (n == *m)
return m;
return NULL;
}
int main()
{
char a[20];
gets(a);
char b;
scanf("%c", &b);
char *p;
p = mystrchr(a, b);
printf("%p\n", p);
return 0;
}
7.
#include <stdio.h>
#include <string.h>
char *mystrchr(char *m, char n)
{
for (; *m != '\0'; m++)
if (n == *m)
return m;
return NULL;
}
int main()
{
char a[20], b[20], c[20];
int i, j = 0;
gets(a);
gets(b);
for (i = 0; b[i] != '\0'; i++)//看数组b中的每一个元素
{
if (mystrchr(a, b[i]) != NULL && mystrchr(c, b[i]) == NULL)//数组b中每一个元素,既要在a中出现,又要在c中不出现
{
c[j] = b[i];//这时才把这个b中元素给c
j++;//j要++
}
}
puts(c);
return 0;
}
#include <stdio.h>
#include <string.h>
char *mystrchr(char *m, char n)
{
for (; *m != '\0'; m++)
if (n == *m)
return m;
return NULL;
}
int main()
{
char a[20], b[20], c[20];
int i, j = 0;
gets(a);
gets(b);
for (i = 0; b[i] != '\0'; i++)//看数组b中的每一个元素
{
if (mystrchr(a, b[i]) != NULL && mystrchr(c, b[i]) == NULL)//数组b中每一个元素,既要在a中出现,又要在c中不出现
{
c[j] = b[i];//这时才把这个b中元素给c
j++;//j要++
}
}
puts(c);
return 0;
}
#include <stdio.h>
#include <string.h>
int mystrchr(char m[], char n) //因为我们需要的是b的下标,所以用数组作形参,而不是指针
{
int i;
for (i = 0; i < strlen(m); i++)
{
if (m[i] == n)
return i;
}
return -1; //如果在a中有b,那么就不会到这一步,而是只到return i就调用函数结束了。到这一步就说明a中没有b。
}
void insertchr(char a[], char b, char c)
{
int j = mystrchr(a, b);//调用另一个函数找到b在a中的下标,用j保存
if (j != -1)//如果b在a中
{
int i;
for (i = strlen(a); i > j; i--)//从尾到b依次往后移一个
a[i] = a[i - 1];
a[j] = c;
}
else
a[strlen(a)] = c;//b不在a中,c放在末尾
}
int main()
{
char a[20], b, c;
gets(a);
scanf("%c%c", &b, &c);
insertchr(a, b, c);
puts(a);
return 0;
}
#include <stdio.h>
#include <string.h>
int mystrchr(char m[], char n) //因为我们需要的是b的下标,所以用数组作形参,而不是指针
{
int i;
for (i = 0; i < strlen(m); i++)
{
if (m[i] == n)
return i;
}
return -1; //如果在a中有b,那么就不会到这一步,而是只到return i就调用函数结束了。到这一步就说明a中没有b。
}
int main()
{
char a[20], b;
gets(a);
scanf("%c", &b);
int i = mystrchr(a, b);
if (i == -1)
printf("b is not in a.\n");
else
{
for (; i < strlen(a); i++)
a[i] = a[i + 1];
puts(a);
}
return 0;
}
11.
#include <stdio.h>
#include <string.h>
int mystrcmp(char a[], char b[])
{
int i;
for (i = 0; a[i] == b[i]; i++)
{
if (a[i] == '\0') //因为a和b长度相等
return 0;
}
return a[i] - b[i];
}
int main()
{
char a[20], b[20];
gets(a);
gets(b);
int i = mystrcmp(a, b);
if (i < 0)
printf("%s<%s\n", a, b);
else if (i > 0)
printf("%s>%s\n", a, b);
else
printf("%s=%s\n", a, b);
return 0;
}
12
#include <stdio.h>
#include <string.h>
int mystrncmp(char a[], char b[], int n)
{
int i;
for (i = 0; i < n; i++)
if (a[i] != b[i])
return a[i] - b[i];
return 0;
}
int main()
{
char a[20], b[20];
int n;
gets(a);
gets(b);
scanf("%d", &n);
int i = mystrncmp(a, b, n);
if (i < 0)
printf("%s<%s\n", a, b);
else if (i > 0)
printf("%s>%s\n", a, b);
else
printf("%s=%s\n", a, b);
return 0;
}
#include <stdio.h>
#include <string.h>
int findsubstr(char a[], char b[])
{
for (int j = 0; a[j] != '\0'; j++) //从a数组第一个元素开始
{
int c = strncmp(a + j, b, strlen(b)); //在a数组中比较字符串a+j和b是否相等,相等返回0,不相等返回非0
if (c == 0)
return j; //若相等,则返回此时b的首元素在a中的下标
}
return -1; //不相等才会运行到这一步,返回-1
}
int main()
{
char a[20], b[10];
gets(a);
gets(b);
int x = findsubstr(a, b); //substr是子串的意思
if (x == -1)
printf("%s does not have %s\n", a, b);
else
printf("%s has %s,and %s's number is %d\n", a, b, b, x);
return 0;
}
14.
#include <stdio.h>
#include <string.h>
int mystrchr(char a[], char b)
{
for (int i = 0; a[i] != '\0'; i++)
{
if (a[i] == b)
return i; //如果能够找到a[i]==b,那么返回下标i
}
return -1; //不能找到,返回-1
}
void insertsubstr(char a[], char b[])
{
int j = mystrchr(a, b[0]);
int c = j;
if (j == -1)
printf("%c is not in %s\n", b[0], a); //不能找到
else //能找到,插入
{
for (int i = strlen(a) + strlen(b); i >= j + strlen(b); i--)
a[i] = a[i - strlen(b)];
for (int d = 0; j < c + strlen(b); j++, d++)
a[j] = b[d];
puts(a); //在调用的函数里面也可以输出
}
}
int main()
{
char a[100], b[20];
gets(a);
gets(b);
insertsubstr(a, b);
return 0;
}
15.
#include <stdio.h>
#include <string.h>
int mystrchr(char a[], char b)
{
for (int i = 0; a[i] != '\0'; i++)
{
if (a[i] == b)
return i; //如果能够找到a[i]==b,那么返回下标i
}
return -1; //不能找到,返回-1
}
void insertsubstr(char *p, char *q)
{
char *x;
x = strchr(p, *q); //p是一个指针变量,相当于数组名,相当于字符串。*q是一个
if (x == NULL)
printf("%c is not in %s\n", *q, p);
else
{
strcat(q, x);
strcpy(x, q);
puts(p);
}
}
int main()
{
char a[100], b[20];
gets(a);
gets(b);
insertsubstr(a, b);
return 0;
}
16
#include <stdio.h>
#include <string.h>
int mystrchr(char a[], char b)
{
for (int i = 0; a[i] != '\0'; i++)
{
if (a[i] == b)
return i; //如果能够找到a[i]==b,那么返回下标i
}
return -1; //不能找到,返回-1
}
void insertsubstr(char *p, char *q)
{
char *x;
x = strchr(p, *q); //p是一个指针变量,相当于数组名,相当于字符串。*q是一个
if (x == NULL)
printf("%c is not in %s\n", *q, p);
else
{
strcat(q, x);
strcpy(x, q);
puts(p);
}
}
int main()
{
char a[100], b[20];
gets(a);
gets(b);
insertsubstr(a, b);
return 0;
}
三、作业
*1、通过字符指针变量输出一个字符串,比如输出“***I love China!****”
#include <stdio.h>
#include <string.h>
int main()
{
char a[20] = "I love China!";
char *p = a;
for (; *p != '\0'; p++)
printf("%c", *p);
printf("\n");
return 0;
}
*2、将字符串a “I am student”复制为字符串b,然后输出字符串b。*
#include <stdio.h>
#include <string.h>
void mystrcpy(char b[], char a[])
{
for (int i = 0; a[i] != '\0'; i++)
b[i] = a[i];
}
int main()
{
char a[20] = "I am a student";
char b[20];
mystrcpy(b, a);
puts(b);
return 0;
}
3、实现字符串****"I love "****和“China”的拼接。
#include <stdio.h>
#include <string.h>
void mystrcat(char a[],char b[])
{
for (int i = strlen(a), j = 0; b[j] != '\0'; i++, j++) //从a结束开始
{
a[i]=b[j];
}
}
int main()
{
char a[20] = "I love ";
char b[20]="China";
mystrcat(a, b);
puts(a);
return 0;
}
4、实现字符串的逆序输出。
#include <stdio.h>
#include <string.h>
int main()
{
char a[100], b[100];
gets(a);
for (int i = strlen(a) - 1, j = 0; a[i] != '\0'; i--, j++)
b[j] = a[i];
puts(b);
}
5****、统计带数字的字符串中的数字个数,并且输出数字。
#include <stdio.h>
#include <string.h>
int main()
{
char a[100];
char b[100];
gets(a);
int i = 0, num = 0, j = 0;
for (; a[i] != '\0'; i++)
if (a[i] >= '0' && a[i] <= '9')
{
num++;
b[j] = a[i];
j++;
}
printf("%d %s\n", num, b);
return 0;
}
6****、统计字符串中的单词个数,单词之间用空格隔开。
#include <stdio.h>
#include <string.h>
int main()//思路,找到数组中不是空格的元素,看他前一个是不是空格,是,则表示单词开始,单词数加1
{
char a[100];
gets(a);//只有利用gets来输入字符串,字符串才可以含有空格,而scanf不行,他只会把空格之前的当成是一个字符串
int i,num;
for(i=0,num=1;i<strlen(a);i++)
{
if(a[i]!=' '&&a[i-1]==' ')
num++;
}
printf("%d\n",num);
return 0;
}
*7*****、字符替换。要求用函数replace将用户输入的字符串中的字符t(T)都替换为e(E),并返回替换字符的个数。 ****
#include <stdio.h>
#include <string.h>
void replace(char a[])
{
int i;
for (i = 0; a[i] != '\0'; i++)
{
if (a[i] == 't')
a[i] = 'e';
else if (a[i] == 'T')
a[i] = 'E';
}
}
int main()
{
char a[200];
gets(a);
replace(a);
puts(a) return 0;
}
8****、编写一个程序,输入星期,输出该星期的英文名。用指针数组处理。
#include <stdio.h>
#include <string.h>
int main()
{
char *p[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};//字符指针数组赋初值,类似于给字指针变量赋初值:char *p=“Monday”;
int x;
scanf("%d",&x);
puts(p[x%7]);
return 0;
}
9****、有5个字符串,首先将它们按照字符串中的字符个数由小到大排列, 再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。
#include <stdio.h>
#include <string.h>
int main()
{
char a[5][20];
char *p[5];
char b[10];
char *q;
int i, j;
for (i = 0; i < 5; i++)
{
gets(a[i]);
p[i] = a[i];
}
printf("\n");
for (i = 0; i < 5 - 1; i++)
for (j = 0; j < 5 - 1 - i; j++)
if (strlen(p[j]) > strlen(p[j + 1]))
{
q = p[j];
p[j] = p[j + 1];
p[j + 1] = q;
}
for (i = 0; i < 5; i++)
puts(p[i]);
printf("\n");
for (i = 0; i < 5; i++)
{
if (*(p[i] + 3 - 1) == '\0')
b[i] = ' ';
else
b[i] = *(p[i] + 2);
}
puts(b);
return 0;
}
10****、定义一个动态数组,长度为变量n,用随机数给数组各元素赋值,然后对数组各单元排序,定义swap函数交换数据单元,要求参数使用指针传递。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Swap(int *a, int *b)
{
int swap;
swap = *a;
*a = *b;
*b = swap;
}
void Array(int *Arr, int n)
{
int i = 0;
int j = 0;
//随机赋值
srand((int) time(0));
for(i = 0; i < n; i++)
{
Arr[i] = rand() % (100);
}
//冒泡排序
for(i = 0; i < n; i++)
{
for(j = i+1; j < n; j++)
{
if(Arr[i] < Arr[j])
Swap(&(Arr[i]), &(Arr[j]));
}
}
}
int main()
{
int n = 0, i; //数组长度
int *Arr = NULL;
printf("Please enter the lenth of array:\n");
scanf("%d", &n); //手动输入
Arr = (int*)malloc(sizeof(int) * n);
Array(Arr, n);
//输出结果
for(i=0; i<n; i++)
{
printf("%d\n",Arr[i]);
}
free(Arr);
return 0;
}
版权归原作者 鱼条一 所有, 如有侵权,请联系我们删除。