C语言程序设计(王立柱)第六章答案 字符串

简介: 只有聪明人才能看见的摘要~( ̄▽ ̄~)~

 字符串函数汇总:

'\0'=0

'空格'=32

'0'~'9'=48~57

'A'~'Z'=65~90

'a'~'z'=97~122,'A'='a'-32

字符输入输出:

int getchar();//从键盘接受一个字符,返回字符的代码

int putchar(int c);//输出字符c,返回c的代码,最好每次调用putchar()函数前调用fflush(stdin)函数清空缓存区,stdin是符号化的缓冲区指针常量

字符串输入输出:

int puts(const char* s);//输出成功返回0

char* gets(char* s);//存入字符串或字符数组s,返回指针s

字符串求长:

int strlen(const char* s);

字符串复制:

char* strcpy(char* s1,const char* s2);//s2复制到s1,s1不能是字符串常量

char* strncpy(char* s1,const char* s2,int n);

使用函数时默认要求s1的空间足以容纳s2

字符串连接:

char* strcat(char* s1,const char* s2);

char* strncat(char* s1,const char* s2,int n);

字符串大小写:

char* strupr(char* s);//将字符串的小写字母改为大写字母,返回指针s,s不能表示字符串常量

char* strlwr(char* s);

字符串比较:

int strcmp(const char* s1,const char* s2);//从后往前比较,相等返回0,前大返回1,后大返回-1

int strncmp(const char* s1,const char* s2,int n);

字符查找:

const char* strchr(const char* s,int ch);

//在s中查找第一个出现的字符ch,返回字符指针,不存在时返回指针0

//int* a=0;指针赋0,就是不指向任何对象,相当于NULL

const char* strrchr(const char* s,int ch);//查找最后一个出现的ch

字符串匹配:

char* strstr(const char* str,const char* substr);

//在主串str中查找第一个出现的子串substr,返回子串在主串中的首字符指针,不存在时返回指针0

编程习题1:在字符串的基本函数方法设计中,大多使用索引方法,改用指针方法重新编写基本函数的代码

编程习题2:编写字符串匹配函数

这里在应用字符串匹配函数验证时有一点需要注意:因为验证了多种情况并使用Puts()输出Strstr()返回的指针,有一种情况是没有找到匹配的子串返回0指针,这时使用Puts()就会出现问题。不能直接用书上的代码,要加上指针为0时的情况,分开输出并返回值。因为对于零指针,不是字符串,也就不满足=='\0'的退出条件,一旦i++,就会超出访问权限。

//usersstring.h
#pragma once
#include<stdio.h>
//字符串输入
char* Gets(char* s) {
  char ch;
  int i = 0;
  ch = getchar();
  while (ch != '\0') {
    *(s + i) = ch;
    ch = getchar();
  }
  *(s + i) = '\0';
  return s;
}
//字符串输出
int Puts(const char* s) {
  if (s == 0) {
    printf("NULL!\n");
    return 0;
  }
  int i = 0;
  while (*(s + i) != '\0') {
    putchar(*(s + i));
    i++;
  }
  printf("\n");
  return 0;
}
//字符串长度
int Strlen(const char* s) {
  int i = 0;
  while (*(s + i) != '\0')
    i++;
  return i;
}
//字符串复制
char* Strcpy(char* s1, const char* s2) {
  int i = 0;
  while (*(s2 + i) != '\0') {
    *(s1 + i) = *(s2 + i);
    i++;
  }
  *(s1 + i) = '\0';
  return s1;
}
char* Strncpy(char* s1, const char* s2, int n) {
  int i;
  int len = Strlen(s1);
  for (i = 0; i < n; i++)
    *(s1 + i) = *(s2 + i);
  if (len < n)
    *(s1 + i) = '\0';
  return s1;
}
//字符串拼接
char* Strcat(char* s1, const char* s2) {
  int i = Strlen(s1);
  int j = 0;
  while (*(s2 + j) != '\0')
    *(s1 + (i++)) = *(s2 + (j++));
  *(s1 + i) = '\0';
  return s1;
}
char* Strncat(char* s1, const char* s2, int n) {
  int i = Strlen(s1);
  int j = 0;
  while (j < n) {
    *(s1 + i) = *(s2 + j);
    i++;
    j++;
  }
  *(s1 + i) = '\0';
  return s1;
}
//字符串大小写
char* Strupr(char* s) {
  int i = 0;
  while (*(s + i) != '\0') {
    if (*(s + i) > 96 && *(s + i) < 123)
      *(s + i) -= 32;
    i++;
  }
  return s;
}
char* Strlwr(char* s) {
  int i = 0;
  while (*(s + i) != '\0') {
    if (*(s + i) > 64 && *(s + i) < 91)
      *(s + i) += 32;
    i++;
  }
  return s;
}
//字符串比较
int Strcmp(const char* s1, const char* s2) {
  int i = 0;
  while (*(s1 + i) != '\0' && *(s2 + i) != '\0') {
    if (*(s1 + i) != *(s2 + i))
      break;
    i++;
  }
  if (*(s1 + i) == '\0' && *(s2 + i) == '\0')
    return 0;
  return *(s1 + i) > *(s2 + i) ? 1 : -1;
}
int Strncmp(const char* s1, const char* s2, int n) {
  int i = 0;
  while (i < n) {
    if (*(s1 + i) != *(s2 + i))
      break;
    i++;
  }
  if (i == n)
    return 0;
  return *(s1 + i) > *(s2 + i) ? 1 : -1;
}
//字符串查找字符(第一次出现,最后一次出现)
const char* Strchr(const char* s, int ch) {
  const char* p = s;
  while (*p != '\0') {
    if (*p == ch)
      return p;
    p++;
  }
  return 0;
}
const char* Strrchr(const char* s, int ch) {
  const char* p = s + Strlen(s) - 1;
  while (p != s) {
    if (*p == ch)
      return p;
    p--;
  }
  return 0;
}
//字符串查找字符串
const char* Strstr(const char* str, const char* substr) {
  const char* p = str;
  int i;
  while (*p != '\0') {
    for (i = 0; i < Strlen(substr); i++)
      if (p[i] != substr[i])
        break;
    if (i == Strlen(substr))
      return p;
    p++;
  }
  return 0;
}
//main.h
#include<stdio.h>
#include"usersstring.h"
int main() {
  //应用重新编写的字符串匹配函数
  const char* p1 = "china is a country";
  const char* p2 = "china";
  const char* p3 = "is";
  const char* p4 = "country";
  char p[20] = "yue";
  const char* p01 = Strstr(p1, p2);
  const char* p02 = Strstr(p1, p3);
  const char* p03 = Strstr(p1, p4);
  const char* p04 = Strstr(p1, p);
  Puts(p01);
  Puts(p02);
  Puts(p03);
  Puts(p04);
  return 0;
}

image.gif


目录
相关文章
|
3天前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
41 16
|
7天前
|
算法 C语言
【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
采用欧几里得算法(EuclideanAlgorithm)求解两个正整数的最大公约数。的最大公约数,然后检查最大公约数是否大于1。如果是,就返回1,表示。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。作为新的参数传递进去。这个递归过程会不断进行,直到。有除1以外的公约数;变为0,此时就找到了最大公约数。开始你的任务吧,祝你成功!是否为0,如果是,那么。就是最大公约数,直接返回。
56 18
|
7天前
|
Serverless C语言
【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码,求解出数值x的平方根;运用迭代公式,编写一个循环程序,求解出数值x的平方根。注意:不能直接用平方根公式/函数求解本题!开始你的任务吧,祝你成功!​ 相关知识 求平方根的迭代公式 绝对值函数fabs() 循环语句 一、求平方根的迭代公式 1.原理 在C语言中,求一个数的平方根可以使用牛顿迭代法。对于方程(为要求平方根的数),设是的第n次近似值,牛顿迭代公式为。 其基本思想是从一个初始近似值开始,通过不断迭代这个公式,使得越来越接近。
37 18
|
7天前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
40 13
|
3天前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
12 3
|
3天前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
8 2
|
7天前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
34 1
|
7天前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
45 23
|
7天前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
34 15
|
7天前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
47 24

热门文章

最新文章