C语言复习-字符串与指针


例一:

【字符串处理 去除C代码中的注释】
  

  C/C++代码中有两种注释,/* */和//。编译器编译预处理时会先移除注释。就是把/*和*/之间的部分去掉,把//以及之后的部分删掉。这里约定,如果出现了/* AAAA /* BBBB */的情况,也就是/**/中出现了/*,那么第二个/*是不当作注释起始的。编写函数void removeComment(char *str)。
  

分析:对于字符串”int c=4,/*c累计量*/ a=3;/*变量*/ // a初值为3 ”先用strstr函数在str中确认”/*” 是否出现过,是则再确认”*/” 是否出现过,是则把str中自”*/”出现位置后2个字符起始的字符串复制到str中”/*”开始的位置,覆盖掉注释部分。循环查找直到找不到”/*”为止;再用strstr在str中确认”//” 是否出现过,是则把出现”//”的位置上置为’\0’

#include <stdio.h>
#include <string.h>
void removeComment(char *str)
{ char *p=str, *q;
while ((p=strstr(p, "/*")) != NULL)
{ q=strstr(p, "*/");
if (q != NULL)
strcpy(p, q+);
}
p = strstr(str, "//");
if (p !=NULL)
*p = '\0';
}
void main( )
{ char s[]="int c=4, /*c累计量*/ a=3; /*变量*/ // a初值为3";
removeComment(s);
printf("%s\n", s);
}

运行结果:

int c=, a=

本体关键在于复习两个重要函数strstr和strcpy

strstr:给定字符数组指针和待查找的字符串,strstr函数将从当前指针开始查找直到第一个遇见待查找字符串,并返回其地址,若未找到则返回NULL。

strcpy: 给定两个字符指针p和q,将把q所指向的内容复制到p所指向的内容。


例二:

【字符串处理 去除字符串中非字母字符 】
编写函数 void FilterNonChar (char *str)
对于字符串
str= ”int c=,/*c累计量*/ a=;/*变量*/ // a为3 ”
最后结果应该是:
str= ”intccaa”
 
分析:
设循环变量k从0到strlen(str)循环,逐个字符判断str[k]是否为字符,是留下,向前移动位置,不是忽略。
for(k=; k<strlen(str); k++)
if (str[k]>=‘a’&&str[k]<=‘z’
|| str[k]>=‘A’&&str[k]<=‘Z’)
// if (isalpha(str[k])) // 此函数隶属于 ctype.h

答案:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
void FilterNonAlpha(char *str)
{ int k, n=;
for(k=; k<strlen(str); k++)
if (str[k]>='a'&&str[k]<='z' || str[k]>='A'&&str[k]<='Z')
// if (isalpha(str[k]))
str[n++]=str[k];
str[n] = '\0'; /* 设置新的字符串尾
}
void main( )
{ char s[]="int c=4,/*c累计量*/ a=;/*变量*/ // a初值为3";
FilterNonAlpha(s);
printf("%s\n", s);
}

本题在于复习字符串扫描时的步进逻辑,核心语句是

str[n++]=str[k];

例三:

3【字符串处理 翻译机】
把一个句子中的单词的顺序倒过来。
输入:
theatre the to went I week Last
输出:
Last week I went to the theatre
 
分析:
如果能循环找出句子中的每一个空格,置为\0,设置一个指针数组,每一个指针指向每一个单词的开始处,逆向打印指针数组中的每一个单词,即可实现翻译机“把一个句子中的单词的顺序倒过来”的要求。
#include <stdio.h>
void main()
{ char s[], *p[];
int k=,n=;
gets(s);
p[] = s;
for(;s[k]; k++) // 中间是条件表达式,s[k]碰上末尾的'\0'会停下
if (s[k]==' ')
{ s[k]='\0'; n++;
p[n]=&s[k+];
}
for(k=n; k>=; k--) // 逆序打印
printf("%s ", p[k]);
}

  这题需要注意的知识点包括:

  1. 指针数组的使用
    1. 指针数组的声明  char *p[100]
    2. 对指针数组中的元素赋值  p[n] = &s[k+1]            p[0] = s
  2. gets()函数的使用
  3. for循环的特殊写法

例四:

【字符串处理 句子单词匹配】
从键盘上输入两个英文句子,输出他们相同单词的个数(句子最少包含一个单词,不包含标点符号,所有字母均为小写,单词与单词之间用’&’符号隔开)。
例如:输入
i&am&a&student
today&is&monday
输出 0
输入
now&is&tow&to&two
tow&classes
输出 1
 
分析:
如果能循环找出句子中的每一个&,置为\0,设置一个指针数组,每一个指针指向每一个单词的开始处,那么句子单词匹配问题就变成了循环比较两个指针数组中单词是否相同并计数。
#include <stdio.h>
#include <string.h>
void main()
{ char s1[],s2[],*p1[],*p2[];
int k,m,n1=,n2=, same=;
gets(s1); gets(s2);
p1[] = s1; p2[] = s2;
for(k=;s1[k]; k++)
if (s1[k]=='&')
{ s1[k]='\0'; n1++; p1[n1]=&s1[k+]; }
for(k=;s2[k]; k++)
if (s2[k]=='&')
{ s2[k]='\0'; n2++; p2[n2]=&s2[k+]; }
for(k=; k<=n1; k++)
for(m=; m<=n2; m++)
if (!strcmp(p1[k],p2[m])) same++;
printf("%d\n", same);
}

本题注意几点:

  1. 输入统统使用字符数组和gets()函数来接收,这样做有几点好处,一来简化scanf写法,二来字符数组可变,相比于静态字符串更加灵活。
  2. 每个单词的存储使用指针数组完成,包括如下几步1.创建适合大小的指针数组,可以暂时不初始化2.遍历特定字符数组时对指针数组中的元素采用取地址赋值


C语言复习-字符串与指针的更多相关文章

  1. go语言之字符串、指针、数组、切片、结构struct、面向对象

    一: 字符串 概述: Go 语言将字符串作为 种原生的基本数据类型,字 符串的初始化可以使用字符串字面量. (1)字符串是常量,可以通过类 数组 索引访问其字节单元,但是不能修改某个字节的值 (2)宇 ...

  2. C语言程序设计--字符串与指针及数组与指针

    数组的基本知识 数组的定义 #define SIZE 5 int array_int[5]; //未声明初始化,默认填零 float array_float[5] = {1.01, 2.23, 3.1 ...

  3. C语言复习---零散补充

    一:double和float使用scanf获取数据 printf输出float和double都可以用%f,double还可以用%lf. 2 scanf输入float用%f,double输入用%lf,不 ...

  4. C语言基础 (9) 数组指针

    复习 只要把地址拿到就能这么操作.. (这里是合法的地址,不是野指针) 只有定义变量后,此变量的地址才是合法的地址 野指针就是保存没有意义地址的指针变量 操作野指针变量本身不会有任何问题 操作野指针所 ...

  5. C++_系列自学课程_第_9_课_C语言风格字符串_《C++ Primer 第四版》

    前面说了写关于数组和指针的内容,这次在这里讨论一下字符串,讨论一下C语言风格的字符串. 在C语言里面我们利用字符数组来对字符串进行处理, 在C++里面我们前面说过一种类类型string可以对字符串进行 ...

  6. 《C语言学习笔记》指针数组及其应用

    C语言中,最灵活但又容易出错的莫过于指针了.而指针数组,是在C中很常见的一个应用.指针数组的意思是说,这个数组存储的所有对象都为指针.除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样. # ...

  7. C语言精要总结-指针系列(二)

    此文为指针系列第二篇: C语言精要总结-指针系列(一) C语言精要总结-指针系列(二) 指针运算 前面提到过指针的解引用运算,除此之外,指针还能进行部分算数运算.关系运算 指针能进行的有意义的算术运算 ...

  8. C语言面试题分类->指针

    有关指针的经典面试题 C语言为何如此长寿并实用?C++为什么有那么多精彩?指针可以说是C/C++中的灵魂所在,虽然早期中pascal也有指针,但是和C/C++比起来不是一个级别的.今天为大家深入浅出的 ...

  9. C语言复习:文件操作

    文件操作专题 C语言文件读写概念 文件分类 按文件的逻辑结构: 记录文件:由具有一定结构的记录组成(定长和不定长) 流式文件:由一个个字符(字节)数据顺序组成 按存储介质: 普通文件:存储介质文件(磁 ...

随机推荐

  1. Biopython 第三方库示例

    Biopython 第三方库示例 https://biopython-cn.readthedocs.io/zh_CN/latest/

  2. Hyper-V设置固定IP

    win+x以管理员启动PowerShell 创建虚拟交换机,等同于在Hyper-V管理器界面中新建虚拟网络交换机 New-VMSwitch -SwitchName "NAT-VM" ...

  3. PHP restore_error_handler() 函数

    定义和用法 restore_error_handler() 函数恢复之前的错误处理程序. 该函数用于在通过 set_error_handler() 函数改变后恢复之前的错误处理程序. 该函数总是返回 ...

  4. PHP zip_close() 函数

    定义和用法 The zip_close() 函数关闭由 zip_open() 函数打开的 zip 档案.高佣联盟 www.cgewang.com 语法 zip_close(zip) 参数 描述 zip ...

  5. java多线程的问题

    1.多线程有什么用 (1) 发挥多核CPU的优势 单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程" ...

  6. Java和C语言谁是编程语言的老大?

    最近,TIOBE 公布了 2020 年 7 月的编程语言排行榜. 本次排行榜的最大亮点就是:C语言击败Java,稳坐老大宝座! 这两年,编程语言排行榜榜首位置,不是C语言,就是Java. 以下为具体榜 ...

  7. linux之DHCP服务端搭建 ( ip分配 四个阶段原理)

    DHCP服务 ip分配 四个阶段原理 1.DHCP服务目的 协议 作用 租约 原理四个阶段 动态主机配置协议(Dynamic Host Configuration Protocol,动态主机配置协议) ...

  8. ios企业签名为什么会掉签?

      我们都知道ios用户无法直接安装App Store之外的应用,对于那些无法上架苹果应用商店的APP,开发者们一般会选择苹果签名的形式.   目前的苹果签名有ios企业签名.超级签名和TF上架这三种 ...

  9. Python3中,map()函数、filter()函数、reduce()函数的比较

    1.map(function,iterable):function为函数,或者lambda表达式,iterable是可迭代的序列,即对iterable中的每个item执行一遍function或者lam ...

  10. JS笔记 数据类型分类以及转换

    数据类型分类 原始类型(基本类型.值类型) 1.number 类型 数字类型,表示32(4字节)的整数以及64位(8字节)的浮点数 整数 bit:位 8bit=1byte 1024byte=1kb千字 ...