首页 > 代码库 > 0, \0, NULL
0, \0, NULL
字符串、字符数组输入、输出与‘\0‘的问题原创首发,欢迎转载!作者按字符串、字符数组以"%s"格式输入时,以遇到‘空格‘为这个字符串输入结束。字符串、字符数组以"%s"格式输出时,以遇到的第一个‘\0‘为输出结束标记!C程序设计(谭浩强,第二版,P134)*************************************************************************平台为VS2008。Example1:#include "stdafx.h"#include <conio.h>int _tmain(int argc, _TCHAR* argv[]){char str[6] = {‘a‘, ‘b‘, ‘4‘, ‘d‘, ‘e‘, ‘f‘}; //没有字符串结束标记\0‘‘printf("%s", str);getch();return 0;}输出:ab4def其实紧接着ef后面还有乱码。(原因就是没有‘\0‘,所以没有停止输出)。*************************************************************************Example2#include "stdafx.h"#include <conio.h>int _tmain(int argc, _TCHAR* argv[]){char str[6] = {‘a‘, ‘b‘, ‘\0‘, ‘d‘, ‘\0‘, ‘f‘};printf("%s", str);getch();return 0;}输出:ab综合Example1和Example2,说明——字符串、字符数组以"%s"格式输出时,以遇到的第一个‘\0‘为输出结束标记!这个规律对puts()同样有效。补充:‘\0‘对应ASII的值为0,即为空。MAC前2个字符"00"---->0x00---->以"%s"形式输出---->结果就是什么都没有输出*************************************************************************Example3#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){char * str = (char *)malloc(8);scanf("%s", str);printf("%s", str);getch();return 0;}输入:GGGL HF输出:GGGL*************************************************************************Example4#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){char * str0 = (char *)malloc(10);char * str1 = (char *)malloc(10);char * str2 = (char *)malloc(10);scanf("%s%s%s", str0, str1, str2);printf("%s\n%s\n%s\n", str0, str1, str2);getch();return 0;}输入:GG GL HF输出:GGGLHF字符串、字符数组以"%s"(使用scanf/sscanf函数时)格式输入时,以遇到‘空格‘为这个字符串输入结束。使用gets()函数则不符合这个规律。**************************************************************************Example5#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){char * str0 = (char *)malloc(10);char * str1 = (char *)malloc(10);char * str2 = (char *)malloc(10);scanf("%s_%s_%s", str0, str1, str2); //试图以输入‘_‘分割printf("%s\n%s\n%s\n", str0, str1, str2);getch();return 0;}说明:试图以输入‘_‘分割,结果乱码。不解,待补充!空字符串(‘‘),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)) { return 1; } else { return 0; }}[/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); // 得字符串长度for (i=L-1;i>0;i--){ // 从尾巴找起,找到非空白为止if (str[i]==‘ ‘ && str[i-1] != ‘ ‘) {str[i] = ‘\0‘; // 处理方法break;}}空字符用‘\0‘,0,还是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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。