字串崩潰原因
//字串崩潰原因:
//①試圖修改字串常量的值 ②越界
//[四個位元組【存放的只是abcde的地址】] char *str1 = "abcde"; //稱為 字串常量 (不能修改字串常量的值)
//[六個位元組,包括‘\0’【存放的都是自己定義的,可以修改】] char str2[] = "abcde"; //稱為 字元陣列 (有\0 所以也是字串)
/*
#include <stdio.h>
int main()
{
char *str1 = "abcde";
char str2[] = "abcde";
//str1[0] = 'x'; //error,因為寫錯誤,即不能修改字串常量的值 ①
str2[0] = 'x';
//strcpy(str1,"xyz"); //error,因為寫錯誤,即不能修改字串常量的值 ②
//strcpy(str2,"hello world"); //error,因為越界
printf("%s\n",str1);
printf("%s\n",str2);
return 0;
}
*/
/*
int main()
{
char str1[10];
gets(str1); //危險,越界,建議使用fgets
printf("str1 = %s\n",str1);
return 0;
}
*/
//例:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[100] = "abcde"; //100,5
char str2[] = "abcde"; //6,5
char str3[100] = "abcdef\0ijk\n"; //100,6 //結果中的6 是因為strlen計算時到\0停止
char str4[] = "abcdef\0ijk\n"; //12,6
char *str5 = "abcde"; //4,5 //結果中的4 是因為* 四個位元組【存放的只是地址】
char *str6 = "abcdef\0ijk\n"; //4,6 //結果中的4 是因為* 四個位元組【存放的只是地址】
printf("%d,%d\n",sizeof(str1),strlen(str1));
printf("%d,%d\n",sizeof(str2),strlen(str2));
printf("%d,%d\n",sizeof(str3),strlen(str3));
printf("%d,%d\n",sizeof(str4),strlen(str4));
printf("%d,%d\n",sizeof(str5),strlen(str5));
printf("%d,%d\n",sizeof(str6),strlen(str6));
return 0;
}