想問一個基礎的問題
假如我有一個字串
char* a="abc"
那寫「a[3]」這個東西是undefined behaviour嗎?
因為我寫
if(a[3]=='\0')
cout<<"yes";
是有順利output出yes的
讓我有點納悶
另外如果不能這樣寫的話是不是就沒有方法access那個字元(null terminator)了?
(同問如果寫 char a[]="abc"
可不可以使用a[3]呢)
謝謝!!
You can use strlen(a)
(from string.h
) to get the string length excluding the null terminator. You can then compare it to 3 to see if there are at least 3 characters. Buckshot Roulette
#include <stdio.h>
#include <string.h>
int main() {
char* a = "abc";
int len = strlen(a);
if (len >= 3) {
printf("String has at least 3 characters (including null terminator)\n");
} else {
printf("String has less than 3 characters\n");
}
return 0;
}
參考
字串
char a[] = "abc"
//等同
char a[4]= {'a', 'b', 'c', '\0'}
然後,char* a="abc"
等同
char abc[4] = {'a', 'b', 'c', '\0'}`
char* a=abc
a是一個指向abc的指標,所以a[3] = abc[3] = '\0'
你的問題涉及到 C/C++ 中字串的定義和存儲方式,讓我來解釋一下:
首先,讓我們看看兩種不同的字串定義:
對於 char* a = "abc";
這種方式,a
是一個指向字元串首位的指標。這意味著 a
實際上是指向 "abc"
字串常量的開始地址。這種定義方式是將字串存儲在只讀區域,並且不允許修改。因此,使用 a[3]
來訪問字串中的第四個元素(即索引為 3 的元素)是未定義行為(undefined behavior),因為你在超出了指向 "abc"
的範圍。儘管在某些情況下可能能正常運行,但不應該依賴這種行為,因為它不符合語言標準。
對於 char a[] = "abc";
這種方式,a
是一個字符數組,長度為 4(包括 null 終止符 \0
)。在這種情況下,a
是可修改的,並且 "abc"
的內容將被拷貝到 a
中。因此,使用 a[3]
是合法的,並且 a[3]
將為 null 終止符 \0
,因為 "abc"
在這裡被看作是一個包含四個字符的字元數組({'a', 'b', 'c', '\0'}
)。
現在回答你的問題:
如果你寫 char* a = "abc";
,使用 a[3]
來訪問字串的第四個元素是未定義行為,因為它超出了字串的範圍,但在某些實現中可能會正常運行(因為後面可能恰好有一個 null 終止符),但這是不可靠的行為。
如果你寫 char a[] = "abc";
,則可以使用 a[3]
來訪問 null 終止符(即空字符 \0
),這是合法的。這樣做可以用來確定字串的實際長度或操作字串的最後一個字符。
總之,對於字串的處理,最好確保按照 C/C++ 語言的規範進行,以避免未定義行為和不可預測的結果。