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. Series结构(常用)

    1.创建 Series 对象 fandango = pd.read_csv("xxx.csv") series_rt = fandango["RottenTomatoes ...

  2. PHP lcg_value() 函数

    实例 返回范围为 (0, 1) 的一个伪随机数: <?phpecho lcg_value();?>高佣联盟 www.cgewang.com 定义和用法 lcg_value() 函数返回范围 ...

  3. luogu P4798 [CEOI2015 Day1]卡尔文球锦标赛 dp 数位dp

    LINK:卡尔文球锦标赛 可以先思考一下合法的序列长什么样子. 可以发现后面的选手可以使用前面出现的编号也可以直接自己新建一个队. 其实有在任意时刻i 序列的mex>max.即要其前缀子序列中1 ...

  4. JAVA的基本程序设计结构(下)

    字符串 Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫做 String. String e=""; //an empty String String ...

  5. 基于深度学习的人脸识别系统Win10 环境安装与配置(python+opencv+tensorflow)

    一.需要下载的软件.环境及文件 (由于之前见识短浅,对Anaconda这个工具不了解,所以需要对安装过程做出改变:就是Python3.7.2的下载安装是可选的,因为Anaconda已经为我们解决Pyt ...

  6. 暑期java(面向对象设计)学习第一阶段总结

    0.前言 本次博客针对的是暑假学习java(面向对象设计)的前三次作业的小结,第一次作业:7-1 对三个整数排序 7-2 对四个整数排序 7-3 对十个整数进行排序 7-4 对多个整数进行排序 第二次 ...

  7. easyPOI使用

    更多的easyPOI资源的网在easypoi的官网. 1 在pom.xml中添加依赖 <dependency> <groupId>cn.afterturn</groupI ...

  8. CSS内容布局

    网页是由不同内容块构成的:标题.段落.链接.列表.图片.视频,等等. 1.定位 定位并不适合总体布局,因为它会把元素拉出页面的正常流. 元素的初始定位方式为静态定位(static),即块级元素垂直堆叠 ...

  9. 【Python笔记】2020年7月30日练习【汉诺塔游戏】

    学习教程:廖雪峰-Python教程-函数-递归函数 学习笔记: 实例代码如下: def move(n, a, b, c): if n == 1: print(a,'--->', c) else: ...

  10. 2020-07-20:你觉得redis有什么缺点,给你改进的话你会怎么改进?

    福哥答案2020-07-20: 1.由于 Redis 是内存数据库,短时间内大量增加数据,可能导致内存不够用.2.redis是单线程的,单台服务器无法充分利用多核服务器的CPU.3.遇到大量查询时容易 ...