字符串输入时的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均可为字符串常量或变量 ...
随机推荐
- Spring4 快速入门
Spring4 快速入门 1 Spring简介 1.1 Spring是什么? Spring 是一个 IOC 和 AOP 容器的开源框架,为简化企业级应用而生. IOC(Inversion of Con ...
- geotrellis使用(三十五)Cesium加载geotrellis TMS瓦片
前言 做任何事情都不是想象中的那么简单.好久没有更新技术博客了,跟最近瞎忙有很大关系,虽说是瞎忙也抽空研究了些技术. 主要是前端渲染,像原生的WebGL和Cesium.WebGL写了几篇博客,自我感觉 ...
- 项目详解4—haproxy 详解
一.企业服务架构图及负载均衡的要求 1.场景说明 在企业生产环境中,每天会有很多的需求变更,比如增加服务器.新业务上线.url路由修改.域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首 ...
- javascript常用的Math对象的方法
简介 Math对象是在程序编程中用于执行一些数学任务的.Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(),像 Math.sin() 这样的函数只是函数, ...
- Linux下安装Redis php-redis扩展 redis重启shell脚本 超详细!
前言 前面刚写过nosql其中三款热门产品的对比,这次主要写关于Redis的一些事情,Redis的介绍.安装以及扩展(php-redis,因为我是phper)安装等等.同时是写给我的朋友(cccjjj ...
- Nova计算节点安装配置
Nova计算节点安装配置 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ## Nova计算节点安装配置 #基本配置 ...
- QQ空间掉帧率优化实战
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 空间新业务需求日益增多,在业务开发阶段的疏忽,或者是受到其他业务的影响(比如一些非空间的业务网络回包或者逻辑在主线程 ...
- 玲珑学院-ACM比赛1014 - Absolute Defeat
1014 - Absolute Defeat Time Limit:2s Memory Limit:64MByte Submissions:257Solved:73 DESCRIPTION Eric ...
- cookie大小
一.浏览器允许每个域名所包含的cookie数: Microsoft指出InternetExplorer8增加cookie限制为每个域名50个,但IE7似乎也允许每个域名50个cookie. Firef ...
- Hibernate学习(二)关系映射----基于外键的单向一对一
事实上,单向1-1与N-1的实质是相同的,1-1是N-1的特例,单向1-1与N-1的映射配置也非常相似.只需要将原来的many-to-one元素增加unique="true"属性, ...