在做串的数据结构时,被字符串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的更多相关文章

  1. js实现文本框或文本域在用户输入时(oninput)触发事件,操作元素

    写在前面:给不同的文本框设定同样的效果,当文本框没有内容输入时,‘下一步’按钮不可用且透明度为0.5.当有内容输入时(并不是获得焦点时focus),‘下一步’按钮状态可用, 且透明度为1. <s ...

  2. PHP 语法字符串函数 strcmp、strlen 使用及实现

    说明 这里基于 php7.2.5 进行测试,php7 之后内部结构变化应该不是太大,但与 php5.X 有差别. 函数分类 用户自定义函数 say(); function say() { echo & ...

  3. 当开始输入文字以及完成文字输入时,变换text field的背景以及系统自带一键删除的 叉叉

    当开始输入文字以及完成文字输入时,变换text field的背景. -(BOOL) textFieldShouldBeginEditing:(UITextField *)textField{ [tex ...

  4. 字符串分隔 ->连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

        •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100 ...

  5. 4 字符串 Swift/Objective -C ——《Swift3.0从入门到出家》

    4 字符串   Swift and Object-C 字符串由多个字符组成,使用 “” 引起的内容 swift语言中提供了两种字符串:可变字符串和不可变字符串 可变字符串:字符串的内容可以修改,字符串 ...

  6. 《程序员代码面试指南》第五章 字符串问题 去掉字符串中连续出现k 个0 的子串

    题目 去掉字符串中连续出现k 个0 的子串 java代码 package com.lizhouwei.chapter5; /** * @Description: 去掉字符串中连续出现k 个0 的子串 ...

  7. c#的中英文混合字符串截取指定长度,startidx从0开始

    //c#的中英文混合字符串截取指定长度,startidx从0开始 by gisoracle@126.com public string getStrLenB(string str, int start ...

  8. 字符串问题----去掉字符串中连续出现K个0的子串

    去掉字符串中连续出现K个0的子串 给定一个字符串str,和一个整数k, 如果str中正好有连续K 个'0'字符出现,把连续的 k 个 '0'去掉,返回处理后的子串. [解题思路] 1. 定义两个变量, ...

  9. Strcmp(字符串1,字符串2)函数 Sizeof && strlen() Substr(a,b)

    Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是:  i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...

随机推荐

  1. scala(一)Nothing、Null、Unit、None 、null 、Nil理解

    相对于java的类型系统,scala无疑要复杂的多!也正是这复杂多变的类型系统才让OOP和FP完美的融合在了一起! Nothing: 如果直接在scala-library中搜索Nothing的话是找不 ...

  2. 在PHP中,将一个汉字数组按照拼音首字母进行排序

    (之前发的这篇博文因为含有敏感关键字,只好重发一遍了) <?php $str = "我们可以在浏览器中看到,当鼠标移到元素上时,元素开始向右移动,开始比较慢,之后则比较快,移开时按原曲 ...

  3. 安卓自定义控件(五)触控基础MotionEvent

    之前去面试,人家说,我这个事件拦截机制写得太少了,还有一个MotionEvent没写,这个确实也很重要,后来我考虑了一下,决定将这篇文章放到自己定义控件里. 先简单再提一下事件分发,事件分发和拦截主要 ...

  4. Akka(38): Http:Entityof ByteString-数据传输基础

    我们说过Akka-http是一个好的系统集成工具,集成是通过数据交换方式实现的.Http是个在网上传输和接收的规范协议.所以,在使用Akka-http之前,可能我们还是需要把Http模式的网上数据交换 ...

  5. memcached一致性哈希及php客户端实现

    1.memcached分布式算法 memcached的分布式是依靠客户端的算法来实现,假设键名为$key,服务器数量为N,常规的实现方式有两种: 取模哈希 crc32($key)%N,通过这个算法将键 ...

  6. PAT 1003. Emergency (25) dij+增加点权数组和最短路径个数数组

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

  7. Nginx实现https网站配置

    咱们下面以google代理实现的方式来实现https.注意这里的https与google的https无关. 代码如下.有备注/usr/local/nginx/config/vhost/hk.cn331 ...

  8. 【深度学习系列】用PaddlePaddle和Tensorflow实现经典CNN网络Vgg

    上周我们讲了经典CNN网络AlexNet对图像分类的效果,2014年,在AlexNet出来的两年后,牛津大学提出了Vgg网络,并在ILSVRC 2014中的classification项目的比赛中取得 ...

  9. PHPstorm 如何新增项目

    如何在PHPstorm新增项目 1.打开设置 2.找到Directories ,点击增加路径

  10. Linux 容器 vs 虚拟机 —— 谁更胜一筹

    自从Linux上的容器变得流行以来,了解Linux容器和虚拟机之间的区别变得更加棘手.本文将向您提供详细信息,以了解Linux容器和虚拟机之间的差异. Linux容器vs虚拟机 – 应用程序与操作系统 ...