今天写代码用到了字符串,需要利用字符串结尾符'\0'判断是否遍历完毕,然后产生了相应的困惑
1.字符串数组是否都具有结尾符?
2.二维字符串数组每一行是否等同于一维字符串数组?
首先说结论:c语言字符串数组都具有结尾符'\0';二位字符串数组每一行等同于一维字符串数组;
运行一下测试代码:
#include <cstdio>
using namespace std;
int main() {
int i;
char str1[] = {"123"}; //等同于 char str1[] = "123";
char str2[3] = {'4', '5', '\0'}; //人工添加结尾符
char str3[3] = {'6','7','8'}; //不规范
char str3_2[3] = {'9'};
// char str4[3] = {'1','2', '3', '\0'}; //声明错误,检测到数组空间不足
printf("输出str1:");
for (i = 0; str1[i]; i++)
printf("%c", str1[i]);
printf("\nstr1结尾符的位置: %d", i);
printf("\n");
printf("输出str2:");
for (i = 0; str2[i]; i++)
printf("%c", str2[i]);
printf("\nstr2结尾符的位置: %d", i);
printf("\n");
printf("输出str3:");
for (i = 0; str3[i]; i++)
printf("%c", str3[i]);
printf("\nstr3结尾符的位置: %d", i);
printf("\n");
printf("输出str3_2:");
for (i = 0; str3_2[i]; i++)
printf("%c", str3_2[i]);
printf("\nstr3_2结尾符的位置: %d", i);
return 0;
}
运行结果:
分析:
列举出可能的赋值形式 ,并最终判断结尾符'\0'来结束输出。由于每次都能输出'\0'的位置数值,可以确定字符串数组结束符一定存在。但如果以不规范的形式赋值,即如同上述str3的形式,结束符空间将不能确定,可能用到了别的 变量的空间。如果单独以不规范的形式测试,则结果会是结束符位置的值为数组空间大小加1(原因暂时未找到),如下图:
#include <cstdio>
using namespace std;
int main() {
int i;
char str3[3] = {'6','7','8'}; //不规范
for (i = 0; str3[i]; i++)
printf("%c", str3[i]);
printf("\n%d", i);
printf("\n");
return 0;
}