【发布时间】:2017-09-17 05:33:42
【问题描述】:
我对 C 非常陌生,对于何时需要手动将终止 '\0' 字符添加到字符串感到有些困惑。给定这个函数来计算字符串长度(为了清楚起见):
int stringLength(char string[])
{
int i = 0;
while (string[i] != '\0') {
i++;
}
return i;
}
根据空终止字符计算字符串的长度。那么,使用以下情况,'\0'字符的作用是什么?
案例一:
char * stack1 = "stack";
printf("WORD %s\n", stack1);
printf("Length %d\n", stringLength(stack1));
打印:
WORD stack
Length 5
案例2:
char stack2[5] = "stack";
printf("WORD %s\n", stack2);
printf("Length %d\n", stringLength(stack2));
打印:
WORD stack���
Length 8
(这些结果每次都不同,但永远不会正确)。
案例3:
char stack3[6] = "stack";
printf("WORD %s\n", stack3);
printf("Length %d\n", stringLength(stack3));
打印:
WORD stack
Length 5
案例4:
char stack4[6] = "stack";
stack4[5] = '\0';
printf("WORD %s\n", stack4);
printf("Length %d\n", stringLength(stack4));
打印:
WORD stack
Length 5
案例 5:
char * stack5 = malloc(sizeof(char) * 5);
if (stack5 != NULL) {
stack5[0] = 's';
stack5[1] = 't';
stack5[2] = 'a';
stack5[3] = 'c';
stack5[4] = 'k';
printf("WORD %s\n", stack5);
printf("Length %d\n", stringLength(stack5));
}
free(stack5);
打印:
WORD stack
Length 5
案例6:
char * stack6 = malloc(sizeof(char) * 6);
if (stack6 != NULL) {
stack6[0] = 's';
stack6[1] = 't';
stack6[2] = 'a';
stack6[3] = 'c';
stack6[4] = 'k';
stack6[5] = '\0';
printf("WORD %s\n", stack6);
printf("Length %d\n", stringLength(stack6));
}
free(stack6);
打印:
WORD stack
Length 5
即,我想知道案例 1、2、3 和 4 之间的区别(以及为什么案例 2 的行为不稳定并且不需要在 1 和 3 中指定空终止字符。另外,如何 3和 4 都工作一样?)以及 5 和 6 如何打印出相同的东西,即使在案例 5 中没有为空终止字符分配足够的内存(因为“slack”中的每个字母只分配了 5 个字符槽,它如何检测'\0'字符,即第6个字符?)
对于这个荒谬的长问题,我感到非常抱歉,只是我在其他任何地方都找不到关于这些特定实例的好的教学解释
【问题讨论】:
-
很广泛地说,如果你有一个字符串存储在一个数组中,那么你必须有某种方法知道字符串的结束位置。两种最明显的方法是 (1) 保持单独的字符计数,或 (2) 用一些唯一字符终止字符串(例如
'\0')。选项 2 似乎是当今最常用的方法,C 会自动以'\0'终止字符串常量。标准 C 库也排除'\0'-终止的字符串。 -
@TomKarzes:“C 自动用 '\0' 终止字符串常量”,只是字符串-literals。
-
不要尝试通过试错来学习 C,因为这会导致抑郁。
标签: c string c-strings null-terminated