字符串、字符数组输入、输出与'\0'的问题
原创首发,欢迎转载!
作者按
字符串、字符数组以"%s"格式输入时,以遇到'空格'为这个字符串输入结束。
字符串、字符数组以"%s"格式输出时,以遇到的第一个'\0'为输出结束标记!
C程序设计(谭浩强,第二版,P134)
*************************************************************************
平台为VS2008。
Example1:
#include "stdafx.h"
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
] = {', 'd', 'e', 'f'};          //没有字符串结束标记\0''
printf("%s", str);
getch();
;
}
输出:ab4def
其实紧接着ef后面还有乱码。(原因就是没有'\0',所以没有停止输出)。
*************************************************************************
Example2
#include "stdafx.h"
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
] = {'a', 'b', '\0', 'd', '\0', 'f'};
printf("%s", str);
getch();
;
}
输出:ab
综合Example1和Example2,说明——字符串、字符数组以"%s"格式输出时,以遇到的第一个'\0'为输出结束标记!
这个规律对puts()同样有效。
补充:"---->0x00---->以"%s"形式输出---->结果就是什么都没有输出
*************************************************************************
Example3
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
);
scanf("%s", str);
printf("%s", str);
getch();
;
}
输入:GGGL HF
输出:GGGL
*************************************************************************
Example4
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
);
);
);
scanf("%s%s%s", str0, str1, str2);
printf("%s\n%s\n%s\n", str0, str1, str2);
getch();
;
}
输入:GG GL HF
输出:
GG
GL
HF
字符串、字符数组以"%s"(使用scanf/sscanf函数时)格式输入时,以遇到'空格'为这个字符串输入结束。
使用gets()函数则不符合这个规律。

**************************************************************************
Example5
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
);
);
);
scanf("%s_%s_%s", str0, str1, str2);                                       //试图以输入'_'分割
printf("%s\n%s\n%s\n", str0, str1, str2);
getch();
;
}
说明:试图以输入'_'分割,结果乱码。不解,待补充!

空字符串(''),0和NULL的关系
应该很多人都还没有认清空字符串('')和NULL的关系吧!!现在我来说明一下吧:
先看一个例子:
'' == NULL;
'' === NULL;
运行之后会发现第一个为true,第二个为false!

为什么会这样呢?其实在PHP中空字符串和NULL都是以值为0存储的!而==只比较值,所以第一个为true!但是第二个为什么是false呢!?
原因是在PHP中变量是以C语言的结构体来存储的,其中这个结构体有个zend_uchar type;这样的成员变量,他是用来保存变量的类型的,而空字符串的类型是string而NULL的类型是NULL。这一点可以用echo gettype('');和echo gettype(NULL);来打印看看!而===运算符是不单比较值,还有比较类型的,所以第二个为false!

所以可以这样说===是等于下面的函数:
[php]
function eq($var1, $var2) {
        if($var1 == $var2 && gettype($var1) == gettype($var2)) {
                ;
        } else {
                ;
        }
}
[/php]

所以空字符串(''),NULL和0是值相等而类型不一样!
说得没错!所以变量没有赋值之前绝对不是等于空字符串的!而是NULL!
单引号 或双引号 里面有空格就不是 NULL 了。不家小心就出错。

=== 比较类型和值
== 只比较值
字符串遇到整数会转为整型.这个 php官方有 .

"并又具有空格的作用" -- 应当叫 “空白”,英文叫 white space. 打出空白的键(或 ASCII 值)有好些个,空格也是其中之一。 

空格 是键盘上 那个长条键产生的码, ASCII 值是 0x20.  字符串的终止符 是 null, ASCII 值是 0x00.

C++实习题要求去掉字符串末尾的所有空格,一般要求是去掉0x20,就是 ' '。
char str[]="abc 123..   ";
int i,L;
L = strlen(str);  //  得字符串长度
;i>;i--){  // 从尾巴找起,找到非空白为止
] != ' ') {
str[i] = '\0'; // 处理方法
break;
}
}

空字符用,还是NULL?
用NULL的代码还挺多的。while (c!=NULL) 

这个显然是错的,NULL 只能表示空指针,gcc 都会警告
warning: NULL used in arithmetic
我用 '\0' 

while (str != NULL && *str != NULL)这么看着怪怪的 

NULL 是且仅是空指针,当然是乱用。这里能编译过那里就报 warning 

空字符串是"" ,'\0' 仅是一个字符而不是一个串 

空字符是\0吧。NULL是空指针。

参考 你必须知道的495个C语言问题  

0, \0, NULL的更多相关文章

  1. Type 'Insus.NET.PictureObject' in Assembly 'App_Code, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

    昨晚想实现一个功能,需要把一个对象存储于ViewState中去,但在运行时,出现下面的异常. Type 'Insus.NET.PictureObject' in Assembly 'App_Code, ...

  2. System.BadImageFormatException : 未能加载文件或程序集“Medici.PaymentRecover, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。

    System.BadImageFormatException : 未能加载文件或程序集“xxxxx.xxxxx, Version=1.0.0.0, Culture=neutral, PublicKey ...

  3. PHP中空字符串介绍0、null、empty和false之间的关系

    PHP中空字符串介绍0.null.empty和false之间的关系 作者: 字体:[增加 减小] 类型:转载 时间:2012-09-25   用PHP开发那么久,PHP中空字符串.0.null.emp ...

  4. Javascript 中的false、0、null、undefined和空字符串对象

    在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象——false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来 ...

  5. 已经导入了具有相同的简单名称“Interop.DSOFramer, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null”的程序集。

    错误  : 已经导入了具有相同的简单名称“Interop.DSOFramer, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null”的程序集. ...

  6. NULL, '\0',0 '0'的区别

    如题,在程序中经常遇到NULL,和'\0',常常疑惑它们是什么关系,其实它们的值是一样的,只不过表现的形式不一样: 1.NULL; NULL 即空指针,在C和C++中的形式不一样,msdn上有如下的内 ...

  7. 未能加载文件或程序集“**, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。

    未能加载文件或程序集“Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项.试图加载格式不正确的程序. 原来, ...

  8. 输入框中的空"",0,null的判断

    改了一个小项目,里面有一个小的问题他们是这样提需求的.两个输入框,第一个输入框里面,输入的内容会对第二个输入框中的内容产生影响.具体是这样的:如果第一个输入框中的值不是“0”,那么第二个输入框就不能填 ...

  9. 优先选择nullptr而不是0和NULL

    我们知道:0是一个int,而不是一个指针.如果C++在一个只有指针才能够使用的上下文中发现它只有一个0,那么它会勉强将0解释成空指针,但那时一种倒退行为.C++的主要方针是0就是一个int,而不是指针 ...

  10. 未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。

    问题描述:在VS中运行一个C#程序,出现错误: 未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项.试 ...

随机推荐

  1. s12-day01-work01用户登录接口

    README # README.md # day001-work-1 @南非波波 功能实现:登录接口 流程图: ![](http://i.imgur.com/61eFd0u.jpg) 程序实现: 1. ...

  2. 8-4 Fabled Rooks uva11134

    题意:你的任务是在n*n的棋盘上放 n 小于5000 个车 使得任意两个车不互相攻击 且第i个车在一个给定的矩形ri之内  给出该矩形左上角坐标和右下角坐标四个点  必须满足放车的位置在矩形内  边上 ...

  3. poj1251 Jungle Roads(Prime || Kruskal)

    题目链接 http://poj.org/problem?id=1251 题意 有n个村庄,村庄之间有道路连接,求一条最短的路径能够连接起所有村庄,输出这条最短路径的长度. 思路 最小生成树问题,使用普 ...

  4. 喜大普奔!Django官方文档终于出中文版了

    喜大普奔!Django官方文档终于出中文版了 文章来源:企鹅号 - Crossin的编程教室 昨天经 Sur 同学告知才发现,Django 官方文档居然支持中文了! 之所以让我觉得惊喜与意外,是因为: ...

  5. button元素的id与onclick的函数名字相同 导致方法失效的问题

    需求需要在原先页面添加一个按钮,触发一个function,如此简单的操作,却无意间发现了一个问题.(还是对html了解的太少) 先看下在菜鸟教程的示例(错误代码) <!DOCTYPE html& ...

  6. Kolla O版本部署

    Kolla O版部署和之前的版本还是有些区别的,环境还是all-in-one 基本准备: 关闭Selina和firewalld [root@kolla ~]# cat /etc/redhat-rele ...

  7. [ 原创 ] Java基础8--什么叫做重载

    重载是在同一个类中,有多个方法名相同,参数列表不同(参数个数不同,参数类型不同),与方法的返回值无关,与权限修饰符无关,B中的参数列表和题目的方法完全一样了.

  8. [ 原创 ] Java基础1--Java中super和this的用法和区别

    许多同学在学习Java时分不清楚this和super的用法和区别,今天偶然发现一片加精的博文,看完内容准备自己也写下来积累一下 1.如果想在子类的构造方法中调用父类的构造方法,必须在子类的构造方法中使 ...

  9. 【10.17校内测试】【二进制数位DP】【博弈论/预处理】【玄学(?)DP】

    Solution 几乎是秒想到的水题叻! 异或很容易想到每一位单独做贡献,所以我们需要统计的是区间内每一位上做的贡献,就是统计区间内每一位是1的数的数量. 所以就写数位dp辣!(昨天才做了数字统计不要 ...

  10. Codeforces Round #248 (Div. 1) B. Nanami's Digital Board 暴力 前缀和

    B. Nanami's Digital Board 题目连接: http://www.codeforces.com/contest/434/problem/B Description Nanami i ...