#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,但为什么忽略该索引之后的所有字符?有人可以解释一下这种行为吗?
答案 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的宏,与不一样
显然从C ++ 11开始nullptr
NULL
可以评估为nullptr
,在C或C ++ 98中,它为0
http://www.cplusplus.com/reference/cstring/NULL/