字符串输入时的strlen()与\0
在做串的数据结构时,被字符串printf %s输出时的结尾判断、strlen();长度、自定义StrCopy();字符串复制函数、StrAssign();字符串赋值函数卡了一下,固写此博巩固相关知识点。
正文如下:
串的结构
这里操作实现的串T是一个0位存储长度、其余位置用于存储字符的串。

相关模块代码
首先,给出字符串赋值函数的代码,便于之后的理解。
#define OK 1
#define MAXSTRLEN 40
typedef int Status;
typedef char SString[MAXSTRLEN]; Status StrAssign(SString T,char *chars)
{
int i;
if(strlen(chars)>MAXSTRLEN)
{
for(i = ;i <= MAXSTRLEN;i++)
{
T[i] = *(chars + i - );
}
T[] = MAXSTRLEN; //T[0]存入int 型数据,%s无法打印
}
else
{
T[] = strlen(chars);
for(i = ;i <= strlen(chars);i++)
{
T[i] = *(chars + i - );
}
}
return OK;
}
代码易错点分析
尤其要注意 strlen() 函数,它在计算长度时没有将' \0 '计算在内,不然就没有空串(长度为零的串)这一说,下面举一个例子去论证·:
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h> int main( void )
{
char buffer[61] = "How long am I?";
int len;
len = strlen( buffer );
printf( "'%s' is %d characters long\n", buffer, len );
} /****************
output:
'How long am I?' is 14 characters long
*******************/
然后我们运用这个结论再去看串赋值函数,就能明白由于循环结束条件是 i <= strlen(chars) ,chars中的' \0 ‘ 是不会赋值给T的,所以当你用printf %s 输出时,数组的存储内容中找不到' \0 ',所以就会一直读下去,直到某个内容是’ \0 ‘ 为止。
以下是我的代码论证:

1. 通过gets(); 或者 scanf(); 由于gets();的特性是将输入的' \n ' 转化为 ' \0 ' 然后赋值给字符串,scanf();的特性是串中读到空白字符(' \n ',' ',与' \t ') 的时候将空白字符转化为\0赋值给字符串,并在缓存区中载入' \n ',因此当用gets();或者scanf();输入'abc'后,str中的char数组都将被赋值为 ' a ' ,' b ',’ c ‘,’ \0 ‘ 。
2. 通过StrAssign();函数 将str的串值赋值给s1,由于循环结束条件是 i <= strlen(chars) ,所以’ \0 ‘不会被赋值到s1当中去。
3.printf(%s, ); 找不到串尾标识‘ \0 ',不断向下查找知道下一个' \0 '的出现,所以导致乱码
代码修改
想到达到printf(%s,);能够正常输出的结果,则需要在串赋值时加上\0,修改情况以及程序执行情况如下:


或者对于串首存长度这种特性的字符串单独写一个Print函数,将s1[1]到s1[MAX]给打印出来。
修改情况以及执行情况如下:
#define OK 1
typedef int Status; /* 打印字符串 */
Status StrPrint(SString T)
{
int i;
for(i = 1;i <= T[0];i++)
printf("%c",T[i]);
printf("\n");
return OK;
}

学会并运用数据结构,的确不易,应潜下心来好好钻研,忌一蹴而就。
字符串输入时的strlen()与\0的更多相关文章
- js实现文本框或文本域在用户输入时(oninput)触发事件,操作元素
写在前面:给不同的文本框设定同样的效果,当文本框没有内容输入时,‘下一步’按钮不可用且透明度为0.5.当有内容输入时(并不是获得焦点时focus),‘下一步’按钮状态可用, 且透明度为1. <s ...
- PHP 语法字符串函数 strcmp、strlen 使用及实现
说明 这里基于 php7.2.5 进行测试,php7 之后内部结构变化应该不是太大,但与 php5.X 有差别. 函数分类 用户自定义函数 say(); function say() { echo & ...
- 当开始输入文字以及完成文字输入时,变换text field的背景以及系统自带一键删除的 叉叉
当开始输入文字以及完成文字输入时,变换text field的背景. -(BOOL) textFieldShouldBeginEditing:(UITextField *)textField{ [tex ...
- 字符串分隔 ->连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100 ...
- 4 字符串 Swift/Objective -C ——《Swift3.0从入门到出家》
4 字符串 Swift and Object-C 字符串由多个字符组成,使用 “” 引起的内容 swift语言中提供了两种字符串:可变字符串和不可变字符串 可变字符串:字符串的内容可以修改,字符串 ...
- 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串
题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...
- c#的中英文混合字符串截取指定长度,startidx从0开始
//c#的中英文混合字符串截取指定长度,startidx从0开始 by gisoracle@126.com public string getStrLenB(string str, int start ...
- 字符串问题----去掉字符串中连续出现K个0的子串
去掉字符串中连续出现K个0的子串 给定一个字符串str,和一个整数k, 如果str中正好有连续K 个'0'字符出现,把连续的 k 个 '0'去掉,返回处理后的子串. [解题思路] 1. 定义两个变量, ...
- Strcmp(字符串1,字符串2)函数 Sizeof && strlen() Substr(a,b)
Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是: i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...
随机推荐
- 1455:An Easy Problem
传送门:http://noi.openjudge.cn/ch0406/1455/ /-24作业 //#include "stdafx.h" #include<bits/std ...
- 【smart-transform】取自 Atom 的 babeljs/coffeescript/typescript 智能转 es5 库
简介 有时间研究下开源库的源码,总是会有些收获的.注意到 Atom 插件编写时,可以直接使用 babel, coffeescript 或者 typescript.有些诧异,毕竟 Electron 中内 ...
- java八大基本数据类型
java中八大数据类型的储存空间以及使用场景表示如下 )1.int:4字节,可以表示的数为-2^31 - 2^31-1.整数的默认类型.封装类也如此 .整数相除的时候,会舍弃小数部分.结果也是整数,例 ...
- 理解defineProperty以及getter、setter
我们常听说vue是用getter与setter实现数据监控的,那么getter与setter到底是什么东西,它与defineProperty是什么关系,平时有哪些用处呢?本文将为大家一一道来. 对象的 ...
- thinkhphp 上传文件或者图片
- Neutron控制节点集群
#Neutron控制节点集群 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html #.Neutron控制节点集群 #本实 ...
- git操作之上传gitthub
push 失败解决方法: 分支操作: 分支操作之覆盖: 主master操作:
- web前端素材整理汇总
最近一直搞前端开发,整理下前端用的一些常用素材,分享给大家 框架类 Vue:https://cn.vuejs.org/ iview:https://www.iviewui.com/ 插件类 Jquer ...
- 室内地图1:从CAD到Map(画图,发布,路径导航)
首先这个教程整理,比较偏细节. 因为我本身不是做GIS,所以可能有点流水账,当然错漏难免,恳请指正. 当我们做定位的时候,想要可视化展示,室外当然可以直接使用google,百度的底图.对于室内,有两种 ...
- Sql Server 的服务器类型
Sql Server 提供了四种服务器类型: 如图所示 : 1, 数据库引擎 2, Analysis Services (分析服务 ) 3, Reporting Services (报告服务) ...