Thắc mắc về khai báo chuỗi trong C

khi tạo chuỗi bao giờ C cũng tự tạo ra ký tự kết thúc để báo chuỗi đã kết thúc, ký tự đó là “\0” hay là NULL. Bạn ko muốn in ký tự đó thì phải đặt là str[n-1].

3 Likes

thế hàm strlen có tính luôn kí tự kết thúc chuỗi không ạ?

1 Like

không đâu pạn.nội dung hàm strlen là:

int main()
{
    int i=0;
    while(c[i])
        i++;
    return i;
}

Giá trị của i chính là độ dài của chuỗi đang xét tới.

3 Likes

strlen không tính ký tự kết thúc chuỗi đâu. Code của @14520054 thể hiện đúng ý tưởng của strlen rồi đấy.

1 Like

tức là nếu xâu s là “abc” thì n sẽ là 3 đúng ko ạ.
e lại khai báo char s1[n] thì khi đó sẽ thành s1[3]
vậy khi đảo xâu thì 3 chỗ của s1 bị giá trị của s ghi vào rồi, vậy sao nó thêm đc kí tự kết thúc ạ?

2 Likes

Nếu n là strlen thì n = 3. Nếu n là size của s1 thì sai. để khai báo s1[n] = "abc" thì n phải bằng 4.

3 Likes

thế lúc khai báo s1 để lưu giá trị đảo xâu s thì phải khai báo là char s1[n+1] ạ?

1 Like

Luôn luôn phải khai báo char s1[n+1]. Không quan trọng là có đảo sâu hay không. Vì chuỗi là một mảng các ký tự và kết thúc bằng ‘\0’. Trong các video của anh có nói rất kỹ về cái này.

2 Likes

tức là nó luôn lấy kí tự cuối cùng làm kí tự kết thúc chuỗi nên nếu khai báo char s1[n] thì s[n-1] sẽ luôn là “\0” phải không ạ?

2 Likes

Chính xác rồi Sáng :smile: Cứ làm thêm nhiều ví dụ là hiểu ngay ấy mà. Hoặc xem mấy video về chuỗi của anh để hiểu rõ hơn.

2 Likes

à, a làm thêm video vè con trỏ và chuỗi đi a.

2 Likes

Trong đó có quá chừng video về con trỏ, em xem đỡ phần C++ nói cực kỳ kỹ lưỡng về con trỏ.

Về chuỗi, thì C và C++ đều có, em search title sẽ thấy nhé.

2 Likes

e thấy mỗi con trỏ và mảng thôi, chưa thấy con trỏ và chuỗi, 2 ngày qua e ngồi search 1 đống tài liệu và cũng tạm hiểu rồi ạ, mà e thấy ng ta bảo khi cấp phát động nên dùng hàm new chứ ko nên dùng malloc. e ko hiểu lắm

1 Like

new là hàm của C++. malloc là hàm của c. Nếu em code C++, hãy dùng new. Nếu code C hãy dùng malloc hoặc calloc.

2 Likes

anh cho em hỏi, tự dưng trả lời cho bạn này xong em nãy sinh ra vấn đề là:

Ví dụ như strlen của abc trả ra 3, mà array index thì bắt đầu từ 0 nên => str[3] là đã đủ chứa cả a,b,c với null character rồi. vậy tại sao phải str[n+1] vậy anh ???

3 Likes

Cái này là em nhầm lẫn kiến thức rồi. Index khác với size. Index bắt đầu từ 0. Thế nên str[3] có nghĩa là ta có str[0], str[1], str[2]. Chấm dứt.

str[3] là ra ngoài mảng rồi, em thao tác trên thằng này là vi phạm vùng nhớ. Chương trình sẽ bị crash ngay.

2 Likes

theo e nghĩ thì:
str[3] chỉ là cho str 3 vị trí.
nên tính từ 0 thì sẽ chạy đến 2 là đủ 3 vị trí rồi nên phải +1 để thêm 1 vị trí cho kí tự kết thúc.

1 Like

e code C nhưng đuôi mở rộng là cpp nên dùng lẫn hàm new của C++ vào đc ạ. :3
không biết làm thế có sao không ạ?

2 Likes

Không sao, nhưng không nên. Nên dùng đuôi .c. Em mới học, cần tách biệt cái nào là C, cái nào là C++. Để sau này không bị nhầm lẫn.

Nên bắt đầu đúng với những cái cơ bản, thì khi nâng cao hơn em sẽ học tốt hơn.

1 Like

e thấy dùng hàm new hay hơn hàm malloc nên mới dùng lẫn cái này thôi. chứ e vẫn cố gắng dùng thuần C ở những chỗ khác. hì

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?