zoukankan      html  css  js  c++  java
  • 0, , NULL

    字符串、字符数组输入、输出与''的问题
    原创首发,欢迎转载!
    作者按
    字符串、字符数组以"%s"格式输入时,以遇到'空格'为这个字符串输入结束。
    字符串、字符数组以"%s"格式输出时,以遇到的第一个''为输出结束标记!
    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'};          //没有字符串结束标记''
    printf("%s", str);
    getch();
    return 0;
    }
    输出:ab4def
    其实紧接着ef后面还有乱码。(原因就是没有'',所以没有停止输出)。
    *************************************************************************
    Example2
    #include "stdafx.h"
    #include <conio.h>
    int _tmain(int argc, _TCHAR* argv[])
    {
    char str[6] = {'a', 'b', '', 'd', '', 'f'};
    printf("%s", str);
    getch();
    return 0;
    }
    输出:ab
    综合Example1和Example2,说明——字符串、字符数组以"%s"格式输出时,以遇到的第一个''为输出结束标记!
    这个规律对puts()同样有效。
    补充:''对应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
    %s
    %s
    ", str0, str1, str2);
    getch();
    return 0;
    }
    输入:GG GL HF
    输出:
    GG
    GL
    HF
    字符串、字符数组以"%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
    %s
    %s
    ", 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] = ''; // 处理方法
    break;
    }
    }
    
    
    
    
    
    
    空字符用'',0,还是NULL? 
    用NULL的代码还挺多的。while (c!=NULL) 
    
    这个显然是错的,NULL 只能表示空指针,gcc 都会警告 
    warning: NULL used in arithmetic 
    我用 '' 
    
    while (str != NULL && *str != NULL)这么看着怪怪的 
    
    NULL 是且仅是空指针,当然是乱用。这里能编译过那里就报 warning 
    
    空字符串是""'' 仅是一个字符而不是一个串 
    
    空字符是吧。NULL是空指针。
    
    参考 你必须知道的495个C语言问题  
  • 相关阅读:
    Git 基础
    SharePoint 2013 对象模型操作"网站设置"菜单
    SharePoint 2013 隐藏部分Ribbon菜单
    SharePoint 2013 Designer系列之数据视图筛选
    SharePoint 2013 Designer系列之数据视图
    SharePoint 2013 Designer系列之自定义列表表单
    SharePoint 2013 设置自定义布局页
    SharePoint 2013 "通知我"功能简介
    SharePoint 2013 创建web应用程序报错"This page can’t be displayed"
    SharePoint 禁用本地回环的两个方法
  • 原文地址:https://www.cnblogs.com/timssd/p/4078311.html
Copyright © 2011-2022 走看看