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. PHP strftime() 函数

    ------------恢复内容开始------------ 实例 根据区域设置格式化本地日期和时间: <?php echo(strftime("%B %d %Y, %X %Z&quo ...

  2. PHP timezone_name_get() 函数

    ------------恢复内容开始------------ 实例 返回时区的名称: <?php$tz=timezone_open("Europe/Paris");echo ...

  3. PHP strchr() 函数

    实例 查找 "world" 在 "Hello world!" 中的第一次出现,并返回字符串的其余部分: <?php高佣联盟 www.cgewang.com ...

  4. PDOStatement::fetchAll

    PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)高佣联盟 www.cgewang.c ...

  5. luogu P5325 Min_25筛

    LINK:Min_25筛 新版感觉有点鬼畜 而且旧版的也够用了至少. 这个并不算很简单也不算很困难的知识点 学起来还是很麻烦的. (误入了很多dalao的blog 说的云里雾里的 甚是懵逼 这里推荐几 ...

  6. 无所不能的Embedding 1 - Word2vec模型详解&代码实现

    word2vec是google 2013年提出的,从大规模语料中训练词向量的模型,在许多场景中都有应用,信息提取相似度计算等等.也是从word2vec开始,embedding在各个领域的应用开始流行, ...

  7. 改改Python代码,运行速度还能提升6万倍

    这份最新研究指出,在后摩尔定律时代,人类所获得的的算力提升将更大程度上来源于计算堆栈的「顶层」,即软件.算法和硬件架构,这将成为一个新的历史趋势. 很多人学习python,不知道从何学起.很多人学习p ...

  8. JS 图片跟随鼠标移动案例

    css代码 img { position: absolute; /* top: 2px; */ width: 50px; height: 50px; } HTML代码 <img src=&quo ...

  9. 在Linux系统中安装Tomcat详细教程

    首先在官网下载jdk和Tomcat的压缩包 这里下载jdk-8u241-linux-x64 .tar.gz 和apache-tomcat-8.5.50.tar.gz 然后解压jdk压缩包 tar –z ...

  10. 简直骚操作,ThreadLocal还能当缓存用

    背景说明 有朋友问我一个关于接口优化的问题,他的优化点很清晰,由于接口中调用了内部很多的 service 去组成了一个完成的业务功能.每个 service 中的逻辑都是独立的,这样就导致了很多查询是重 ...