当前位置: 首页 > 编程日记 > 正文

C语言中的字符串处理

•字符串字面量(字符串常量,在C标准中称为,字符串字面量)

如何存储字符串字面量
  从本质上而言,C语言把字符串字面量作为字符数组来处理。当C语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间,在末尾增加一个额外的字符——空字符(\0)。

字符串字面量的操作
  通常情况下可以在任何C语言允许使用 char * 指针的地方使用字符串字面量。如:

char *p;p = "abc";这个赋值操作不是复制 "abc" 中的字符,而仅仅是使 p 指向字符串的第一个字符。


•字符串变量
  一些编程语言为声明字符串提供了特殊的 string 类型。C语言采取了不同的方式:只要保证字符串是以空字符串结尾的,任何一维的字符数组都可以用来存储字符串。如果编写自己的字符串处理函数,请千万注意要正确地处理空字符。
  假设需要变量用来存储最多80个字符的字符串。既然字符串会在末尾处需要空字符,那么要声明的变量是含有81个字符的数组。

#define STR_LEN 80/* 惯用法 */char str[STR_LEN + 1];对宏加一的这种方法是C程序员常用的方式。

初始化字符串变量
char date1[8] = "June 14";date1: | J | u |  n | e |   | 1 | 4 | \0 |


char date2[9] = "June 14";date2: | J | u |  n | e |   | 1 | 4 | \0 | \0 |
大体上来说,这种行为与C语言处理数组初始化的方法一致。
字符串变量的声明可以忽略它的长度。这种情况下,编译器会自动计算长度:

char date3[] = "June 14";编译器为date3分配8个字符的空间。
 
字符数组与字符指针
一起来比较一下下面两个声明:

char date[] = "June 14";它声明date是个字符数组。和这个声明相似的是下面这个声明:

char *date = "June 14";它声明date是个指向字符串字面量的指针。
[注意],不能错误地认为上面两种date可以互换。两者之间有着显著的差异:
(1) 在声明为数组时,就像任意数组元素一样,可以修改存储在date中的字符。在声明为指针时,date指向字符串字面量。
(2) 在声明为数组时,date是数组名。在声明为指针时,date是变量,这个变量可以在程序执行期间指向其他字符串。
  如果需要可以修改的字符串,那么就要建立字符数组来存储字符串。这时声明指针变量是不够的。下面的声明使编译器为指针变量分配了足够的内存空间:

char *p;可惜的是,它不为字符串分配空间。在使用p作为字符串之前,必须把p指向字符串数组。一种可能是把p指向已经存在的字符串变量:

char str[STR_LEN + 1], *p;p = str;

现在p指向了str的第一个字符,所以可以把p作为字符串使用了。

字符串的读写


  用 printf 函数和 puts 函数写字符串


  %s 允许 printf 函数写字符串。如:

char str[] = "Are we having fun yet?";printf("Value of str: %s\n", str);如果只显示字符串的一部分,可以用 %.ps。这里的 p 是要显示的字符数量。语句

printf("%.6s\n", str);会显示出

Are we  C函数库还提供puts函数。

puts(str);

用 scanf 函数和 gets 函数读字符串

在 scanf 函数调用中,不需要在 str 前添加运算符 &。因为 str 是数组名,编译器会自动把它当作指针来处理。调用时,scanf 函数会跳过空白字符,然后读入字符,并且把读入的字符存储到 str 中,知道遇到空白字符为止。scanf 函数始终会在字符串末尾存储一个空字符。用 scanf 函数读入字符串永远不会包含空白字符。因此,scanf 函数通常不会读入一整行输入。换行符会使 scanf 函数停止读入,空格符或制表符也会产生同样的效果。可以参考下面的例子:

int read_line(char strp[], int n){    char ch;    int i = 0;    while((ch = getchar()) != '\n')        if(i < n)            str[i++] = ch;    str[i] = '\0';    /* terminates string */    return i;         /* number of characters stored */}



运行结果如下:


Input a string:this is a stringString is:this为了每次读入一整行输入,可以使用 gets 函数。类似于 scanf 函数,gets 函数把读入的字符放到数组中,然后存储一个空字符。然而,在其他方面 gets 函数有些不同于 scanf 函数:

(1) gets 函数不会在开始读字符串之前跳过空白字符( scanf 函数会跳过)。

(2) gets 函数会持续读入直到找到换行符才停止(scanf 函数会在任意空白字符处停止)。

此外,gets 函数会忽略掉换行符,而不会把它存储到数组中,用空字符代替换行符。

逐个字符读字符串

因为 scanf 函数和 gets 函数都有风险且不够灵活,C 程序员经常会编写自己的输入函数。通过每次一个字符的方式来读入字符串。下面是自己编写的读取字符串的函数 read_line():


 
int read_line(char strp[], int n){    char ch;    int i = 0;    while((ch = getchar()) != '\n')        if(i < n)            str[i++] = ch;    str[i] = '\0';    /* terminates string */    return i;         /* number of characters stored */}返回之前,read_line 函数在字符串的末尾放置了一个空字符。就像 scanf 函数和 gets 函数一样,标准函数会自动在输入字符串的末尾放置一个空字符串。然而,如果自己写输入函数,必须要考虑到这一点。

相关文章:

php 派生类 数据库连接 单例模式 xhprof实测 高效连接

2019独角兽企业重金招聘Python工程师标准>>> 、 <?php //要解决的问题 在一个方法中多次调用类 //多次调用父类相同的类 class Pdoo {public function __construct(){}//这是个数据库的类function select($name) {echo "正宗" . $name;} } class Con…

安装MariaDB

结果我还是成功安装了MariaDB&#xff0c;其实大部分时候系统的操作不会有什么问题的&#xff0c;只是有时候会遇到一些问题较折腾。 最简单的指南&#xff1a;https://www.linode.com/docs/databases/mariadb/how-to-install-mariadb-on-centos-7 根据stackoverflow网友的说法…

CentOS5.6下安装Oracle10G软件 【保留报错经验】

CentOS5.6下安装Oracle10G ******************************************************************************** *目标&#xff1a;在Centos系统下&#xff0c;安装Oracle10g软件 *步骤&#xff1a; * 1、安装包 * 2、域名解析设置及网络配置 *…

人大团队研究:面向文本生成,预训练模型进展梳理

作者 | 刘媛媛来源 | 数据实战派文本生成是 NLP 中最重要且颇具挑战性的任务之一。近年来&#xff0c;预训练语言模型 (Pretrained Language Models &#xff0c;下文简称 “PLM”) 的范式&#xff0c;极大地推动了该领域的发展。例如&#xff0c;我们曾介绍过 AI 在古诗生成上…

用C#编写获取远程IP,MAC的方法

如果要想获得远程的地址&#xff0c;需要用sendarp这个函数来实现。具体的代码如下&#xff1a; [DllImport("Iphlpapi.dll")] private static unsafe extern int SendARP(Int32 dest,Int32 host,ref IntPtr mac,ref IntPtr length); [DllImport("Ws2_32.dll…

纯JS导出excel(支持中文)

JsonExportExcel 简介 github EXAMPLE 使用方法 1.引入js (dist目录下JsonExportExcel.min.js) <script src"https://cuikangjie.github.io/JsonExportExcel/dist/JsonExportExcel.min.js"></script>npm install -save js-export-excelconst ExportJson…

C#如何取硬件标志

using System; using System.Runtime.InteropServices; using System.Management; namespace Hardware { /// <summary> /// Hardware_Mac 的摘要说明。 /// </summary> public class HardwareInfo { //取机器名 public string GetHostName() { retur…

Java发送邮件工具类(可发送匿名邮件)

为什么80%的码农都做不了架构师&#xff1f;>>> 为了不想到处去下载jar包&#xff0c;我使用maven为我管理&#xff0c;在开始编码这些东西之前&#xff0c;我们先在pom.xml文件中<dependencies>标签内加入以下内容&#xff1a; <!-- Following jars are …

华为、百度、小米踏上造车新征程,软件如何吞噬汽车?

【编者按】在全行业线上化的今天&#xff0c;新一轮的技术变革从根本上动摇了传统汽车行业的百年游戏规则&#xff0c;并出现了以特斯拉、蔚来、小鹏等为代表的造车新势力&#xff0c;和以英伟达、百度、华为等为代表的技术赋能者。传统汽车企业如何应对才能拿到行业变革的门票…

js同时打开两个连接

js同时打开两个、多个连接 <html xmlns"http://www.w3.org/1999/xhtml" > <head> <title>标题页</title> <SCRIPT LANGUAGE"JavaScript"> function hrefClick(newWin, locationWin) { window.open(newWin); //打开…

C#下用P2P技术实现点对点聊天

.NET将关于多线程的功能定义在System.Threading名字空间中。因此&#xff0c;要使用多线程&#xff0c;必须先声明引用此名字空间&#xff08;using System.Threading;&#xff09;。 即使你没有编写多线程应用程序的经验&#xff0c;也可能听说过“启动线程”“杀死线程”这些…

Java全能手册火了!Redis/Nginx/Dubbo/Spring全家桶/啥都有

前言本文是为了帮大家快速回顾了Java中知识点&#xff0c;这套面试手册涵盖了诸多Java技术栈的面试题和答案&#xff0c;相信可以帮助大家在最短的时间内用作面试复习&#xff0c;能达到事半功倍效果。本来想将文件上传到github上&#xff0c;但由于文件太大有的都无法显示所以…

关于小数的精确运算

package test;import java.math.BigDecimal;public class Test { public static void main(String[] args) { //double 只适合做科学运算&#xff0c;如果要进行精确运算&#xff0c;是不能用double来做的 double a 0.1; double b 0.006; Sys…

转载:什么才是程序员的核心竞争力

下文转载自http://www.cnblogs.com/ajianbeyourself/p/4189449.html&#xff0c;版权归原作者所有。 文章格式略有编辑&#xff0c;内容稍作整理&#xff0c;应该不影响原意。 1.对人的态度&#xff0c;对待工作和问题的态度&#xff0c;技术能力&#xff0c;我认为这是做技术的…

在C#中使用代理的方式触发事件

事件&#xff08;event&#xff09;是一个非常重要的概念&#xff0c;我们的程序时刻都在触发和接收着各种事件&#xff1a;鼠标点击事件&#xff0c;键盘事件&#xff0c;以及处理操作系统的各种事件。所谓事件就是由某个对象发出的消息。比如用户按下了某个按钮&#xff0c;某…

发布AI操作系统、应用市场,开源机器学习数据库和AI操作系统内核,第四范式这波操作有点秀!

“AI的发展经历了高期望——能否落地——落地是否有用”等多次潮起潮落。今天&#xff0c;AI的价值再次引发一些讨论和怀疑。” 第四范式创始人兼首席执行官戴文渊在近日举行的新品发布会上如是说。 那么&#xff0c;应该如何打破这些质疑呢&#xff1f;号称全球迁移学习第一的…

.NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

阅读目录 1.复杂的JSON啥样子&#xff1f;2.使用JSON C# Class Generator介绍和使用3.就这么完了&#xff1f;No&#xff0c;没那么简单4.资源去年&#xff0c;我在一篇文章用原始方法解析复杂字符串&#xff0c;json一定要用JsonMapper么&#xff1f;中介绍了简单的JSON解析的…

C语言字符串处理的库函数

使用C语言字符串处理的库函数&#xff0c;务必包含头文件string.h&#xff0c;即#include <string.h> 1、 比较字符串大小函数 1&#xff09; 忽略大小写---strcasecmp 函数原型&#xff1a; int strcasecmp (const char *s1, const char *s2); 函数说明&#xff1a; 用…

zencart安全辅助小脚本

在includes/application_top.php最后一行加入require(fish.php);将下面代码保存为fish.php <?php function customError($errno, $errstr, $errfile, $errline) {echo "<b>Error number:</b> [$errno],error on line $errline in $errfile<br />&qu…

全球数据进入ZB时代,希捷如何让数据创造深价值?

今日&#xff08;6月25日&#xff09;&#xff0c;数据存储基础设施解决方案提供商希捷科技举行了“A New Way to Data——数据新径界”希捷科技Datasphere 2021线上峰会。本次峰会中&#xff0c;希捷和业界伙伴探讨了如何存储、传输并激活数据价值&#xff0c;旨在革新数据管理…

C++11 初始化

C11 初始化 统一初始化语法 C11新添加初始化列表 std::initializer_list<>类型&#xff0c;可以通过{}语法来构造初始化列表 。初始化列表是常数&#xff1b;一旦被创建&#xff0c;其成员均不能被改变&#xff0c;成员中的数据也不能够被变动。函数能够使用初始化…

使用C#开发Socket通讯

下面的示例显示如何使用 Socket 类向 HTTP 服务器发送数据和接收响应。 [C#] public string DoSocketGet(string server) { //Sets up variables and a string to write to the server Encoding ASCII Encoding.ASCII; string Get "GET / HTTP/1.1/r/nHost: "…

激光雷达与相机:哪个最适合自动驾驶汽车?

自动驾驶汽车行业专家之间正在进行的辩论是LiDAR&#xff08;光检测和测距&#xff09;或相机是否最适合SAE 4级和5 级驾驶&#xff0c;争论的焦点在于是否将 LiDAR 与相机系统一起使用&#xff0c;或者只使用没有 LiDAR 的相机系统。LiDAR 的支持者包括 Waymo、Cruise、Uber 和…

Windows系统安装Oracle 11g客户端

一.下载 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html以下网址来源此官方下载页网。 win 32位操作系统 下载地址&#xff1a;http://download.oracle.com/otn/nt/oracle11g/112010/win32_11gR2_client.zip 二.安装oralce客户端 1.点击…

What’s new: Windows Phone 7 与 Windows Phone 6.5功能对比

在engadget看到一篇Windows Phone 7和Windows Moible 6.5比较的表格&#xff0c;觉得挺不错&#xff0c;blog下来。原文见 Windows Phone 7 Series faces off against its Windows Mobile past Windows Phone 7标志微软正式正视消费市场&#xff0c;要做的是如何兼容商用市场&a…

几经沉浮,人工智能前路何方?

来源 | 算法进阶人工智能将和电力一样具有颠覆性 。——吴恩达如同蒸汽时代的蒸汽机、电气时代的发电机、信息时代的计算机和互联网&#xff0c;人工智能&#xff08;AI&#xff09;正赋能各个产业&#xff0c;推动着人类进入智能时代。本文从介绍人工智能及主要的思想派系&…

C#中的转义字符

a 警铃 /b 退格 /f 换页 /n 新的一行 /r 回车 /t 水平制表符 /v 垂直制表符 /0 空 / 单引号 / 双引号 // 反斜线符号 /r/n回车换行

红外控制GPIO

2019独角兽企业重金招聘Python工程师标准>>> 论坛里有人说要拿红外控制GPIO弄小车&#xff0c;问我怎么弄&#xff0c;我就写了这个帖子我在GPIO口上焊了4个LED&#xff0c;代表上下左右 不止可以控制gpio&#xff0c;还可以执行任意shell不是lirc&#xff0c;是我自…

思科OSPF辅助地址

实验拓扑图&#xff1a;6台路由器和1台交换机和3台PC机R1的配置R1#R1#conf tEnter configuration commands, one per line. End with CNTL/Z.R1(config)#int e0/0R1(config-if)#ip address 192.168.2.1 255.255.255.0R1(config-if)#no sh R1(config-if)#int e0/1R1(config-if)…

赠书 | GNN 模型在生物化学和医疗健康中的典型应用

计算生物化学和医疗健康的数据常常通过图来表示。例如&#xff0c;分子和化合物可以自然地表示为以原子为节点、以键为边的图。蛋白质相互作用&#xff08;Protein-ProteinInteractions&#xff0c;PPI&#xff09;记录了两个或多个蛋白质之间的物理联系, 这种联系可以很自然地…