第二周-字符串

一、学习笔记:

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;

}

2. 判断字符串是否回文

#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;
}

8.

#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;
}

9.

#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;
}

 10.

#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;
}

 13.

#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;
}

​​​​​​​​​​​​​​

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值