字符串终止C / C ++ char = 0

时间:2017-08-10 04:55:59

标签: c string

#include<stdio.h>
#include<string.h>

void terminateString(char *str){
    str[3] = 0;
    printf("string after termination is:%s\n",str);
}

int main(){
    char str[]="abababcdfef";
    terminateString(str);
    return 0;
}

输出:

string after termination is:aba

我们只将索引'3'处的元素指定为0,但为什么忽略该索引之后的所有字符?有人可以解释一下这种行为吗?

5 个答案:

答案 0 :(得分:6)

  

我们只将索引'3'处的元素指定为0,但为什么要这样做   忽略该索引后的字符?有人可以解释一下   这种行为?

使用以零结尾的字符串的约定是0字节表示字符串的结尾。因此,当printf()在位置3遇到零字节时,它会停止打印。

答案 1 :(得分:2)

ISO C标准定义了一个字符串如下(例如,参见C11 7.1.1 Definition of terms),重点是我的:

  

字符串是由 第一个 空字符终止并包含的连续字符序列。

因此,当你有字符序列abababcdfef\0时,那确实是一个字符串。

但是,当你在偏移量3处放置一个空值时,字符串不是 aba\0abcdfef\0但是,由于它只是一个字符串,包括首先为null,它是aba\0

答案 2 :(得分:1)

您演示的是字符串和字符串数组之间的c ++差异。字符串是一系列字符,它们一直延续到第一个空字符。字符数组是内存分配单元。字符串可能不会使用为其分配的整个字符数组(实际上它甚至可能超出包含数组的边界)。如果要诊断打印数组而不是字符串,则需要在循环中迭代数组。见下文:

#include<stdio.h>
#include<string.h>

void terminateString(char *str){
    str[3] = 0;
    printf("string after termination is:%s\n",str);
}

int main(){
    char str[]="abababcdfef";
    terminateString(str);
    for (int i = 0; i < sizeof(str)/sizeof(str[0]); i++) {
        (str[i] != 0) ? printf("%c ", str[i]) : printf("\\0 ");
    }
    printf("\n");
    return 0;
}
// OUTPUT
// string after termination is:aba
// a b a \0 a b c d f e f \0

答案 3 :(得分:1)

C-string是以空值终止的字符串。使用以null结尾,表示“空字符终止(表示结束)字符串”。

空字符是一个字符,其所有位都设置为0,或\0,在内存中显示为0x00

当您设置str[3] = 0时,您将str [3]更改为终结符令牌,因此当printf读取终结符时,它认为该字符串已结束且仅打印“aba”。

答案 4 :(得分:-2)

c / c ++并没有真正区分0,'\ 0'和NULL,它们在内存中只是0。 c样式字符串是以'\ 0'结尾的字符序列,因此与它们一起使用的每个函数在找到此字符后结束。当您指定str[3]=0;时,它与str[3]='\0';相同,即在3个字符后停止字符串。如果你想要字母0,请执行str[3]='0';,其中单引号让编译器知道你想要字符0,ascii 48

修改

请注意NULL是一个评估为0的宏,nullptr 不一样 显然从C ++ 11开始NULL可以评估为nullptr,在C或C ++ 98中,它为0 http://www.cplusplus.com/reference/cstring/NULL/