Video Ngôn Ngữ C - 10 - Mảng ký tự hay còn được gọi là chuỗi

Source code

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char dau_hoi = '?';
    printf("dau hoi %c\n", dau_hoi);
    char ky_tu_dac_biet = '\\';
    printf("ky tu dac biet %c\n", ky_tu_dac_biet);
    char mang_ky_tu[3] = {'d', 'a', 't'};
    printf("mang ky tu %c%c%c\n", mang_ky_tu[0], mang_ky_tu[1], mang_ky_tu[2]);
    char mang_ky_tu_chuyen_nghiep[] = "dat - chuyen nghiep";
    printf("mang ky tu %s\n", mang_ky_tu_chuyen_nghiep);
    char mang_mot_ky_tu[] = "";
    printf("%c %c %c", mang_ky_tu_chuyen_nghiep[2], mang_ky_tu_chuyen_nghiep[4], mang_ky_tu_chuyen_nghiep[7]);
    return 0;
}

#Đăng ký khóa học C++ cơ bản 2016 ( NEW ) tại đây :
#Thông tin về khóa học xem tại đây :

-Sự khác biệt giữa 2 khóa học cũ và mới :
+Khóa học C++ cơ bản 2016 là khóa học mới, được đầu tư nhiều hơn từ nội dung, phương pháp học, cách học hiệu quả.
+Trong khóa học còn có nhiều kiến thức mới như thực hành trên HackerRank, thực hành trên Codefights và Đạt nghĩ mọi người nên học khóa học mới, bởi vì đây là kiến thức mới, phù hợp với hiện tại… Mặt khác âm thanh cũng tốt hơn nhiều so với khóa học cũ giúp đỡ việc lắng nghe và hiểu được tốt hơn.

5 Likes

cho em hỏi khúc cuối, phần bài tập, mang[3]=0 , phần = 0 có ý nghĩa gì, theo em thì %s là string (chuỗi) sẽ lấy cái mang[3] ghép vào, nhưng tại sao lại có =0
thanks

1 Like

mang[3] = 0 sẽ làm cho hàm printf khi xuất chuỗi ra sẽ ngừng khi gặp giá trị 0. Đó là quy tắc để phân biệt chuỗi và mảng ký tự trong C.

Chuối tức là mảng ký tự kết thúc bằng 0.

7 Likes

Có phải nó sẽ chèn \0 vào sau chữ “dat” trong mảng kí tự “datxyz” hả anh?

Lúc đầu ghi

char mang[] = "datxyz";

thì đây là mảng, còn sau khi
mang[3] = 0; thì nó lại thành chuỗi ạ?
Mà em đọc ở 1 chỗ khác bảo có xâu rỗng (e nghĩ cũng là chuỗi rỗng) :confused: thế thì cái \0 ở đâu ạ?

Đúng rồi em.

Em đọc cái tiêu đề kìa: Mảng ký tự hay còn được gọi là chuỗi. Hai thứ này là một.

Xâu rỗng (chuỗi rỗng) có 1 phần tử, phần tử đó là \0. Nếu anh ghi

char mang[] = "";

thì cũng tương đương với việc ghi

char mang[1] = {0};

hoặc

char mang[1] = {'\0'};
1 Like
  1. Do em dốt văn hay sao mà vẫn cứ nghĩ 2 cái này khác nhau anh ạ@@ Câu trên thì anh bảo đấy là cách để phân biệt 2 cái :expressionless: dưới thì lại bảo 2 cái là 1@@

https://www.google.com.vn/?gfe_rd=cr&ei=rl3CVL-JLMuGoAOJ6oGoCA&gws_rd=ssl#q=cách+phân+biệt+mảng+và+chuỗi+ký+tự+trong+C&spell=1

em xem trong này(cái kink đầu tiên, soict của đhbk ấy ạ, chả hiểu sao e ấn vào nó tự động getlink luôn@@, phải down về mới xem được, trang 16/23 ấy ạ) thì bảo xâu rỗng là xâu ko có kí tự nào :confused: nó sai hả anh?


cái đầu thì em hiểu rồi, còn cái thứ 2 thì e chưa hiểu :confused: trong mảng thì đánh số từ 0 cơ mà ạ? nếu thế kia thì mảng đấy vẫn có 2 phần tử, 1 phần tử bình thường còn 1 phần tử là \0

Oh, cái này là anh tự cắn lưỡi mình rồi :smile: Để anh nói rõ hơn nhé

Chuỗi và mảng ký tự là một, nhưng khi có ký tự kết thúc chuỗi thì đó rõ ràng là chuỗi, còn nếu không có ký tự kết thúc chuỗi, thì anh có thể coi đó là mảng thôi cũng được.

Sai, có ít nhất một ký tự, là ký tự kết thúc chuỗi. Em hoàn toàn có thể kiểm tra được bằng cách debug mà :smile:

Anh ví dụ bằng chương trình cho em dễ hiểu nhé

#include <stdio.h>

int main() {
    char mang1[] = "";
    char mang2[1] = {0};
    printf("mang1 %s\n", mang1);
    printf("mang2 %s\n", mang2);

    printf("so phan tu cua mang1 %d\n", sizeof(mang1));
    printf("so phan tu cua mang2 %d\n", sizeof(mang2));

    printf("phan tu duy nhat cua mang1 co gia tri %d\n", mang1[0]);
    printf("phan tu duy nhat cua mang2 co gia tri %d\n", mang2[0]);
    return 0;
}

Output:

mang1
mang2
so phan tu cua mang1 1
so phan tu cua mang2 1
phan tu duy nhat cua mang1 co gia tri 0
phan tu duy nhat cua mang2 co gia tri 0

3 Likes

nếu vậy thì kích thước của chuỗi bằng số phần tử nhìn thấy + kí tự kết thúc chuỗi anh nhi :confused:
Giờ e code như thế này:


thì “duc96” có tận 6 kí tự :confused: nó lòi ra thêm 1 cái kí hiệu trông như cái mặt cười là sao ạ@@

Bởi vì ký tự cuối cùng là ký tự rác, dẫn đến khi em in ra thì nó ra một ký tự không biết trước được.

Để khỏi bị lỗi này, em khai báo cái mảng có 6 ký tự

char mang[6]

Điều này để chứng minh ký tự cuối cùng là kết thúc chuỗi

1 Like

I moved 3 posts to a new topic: Làm sao để in ra kí tự ’

bài này khó quá bạn có thể update lại code được không?

Mình đã cập nhật source code rồi đó @minhtranlenguyen

2 Likes

I moved a post to a new topic: Làm sao để post source code lên diễn đàn?

1 Like

cảm ơn bạn tui biết rồi cảm ơn bạn vì đã post lại code ở bài 10
bạn cho tui hỏi %d là số nguyên %s là chữ còn %f là số lẻ
vậy còn int , float dùng để làm gì làm gì
tui đang học đến bài 10 à còn char nữa chứ

int là số nguyên, float là số thực (hay như cách bạn gọi là số lẻ)

%d có thể in được: int, unsigned int
%f có thể int được: float, double

Link này giải thích đầy đủ

http://www.cplusplus.com/reference/cstdio/printf/

char dùng %c

2 Likes

cho mình hỏi là vì sao phải dùng là %c mà không được dùng %s ? Và có cách nào để không bị nhầm không?

%c dùng để in một ký tự, là viết tắt của character

%s dùng để in một chuỗi ký tự, là viết tắt của string

@Minh_Toan xem thêm chuỗi video hướng dẫn C nhé: http://portal.daynhauhoc.com/p/hoc-lap-trinh-ngon-ngu-c/

1 Like

I moved 2 posts to a new topic: Trong C có khai báo mảng 2 chiều bằng new được không?

thế nếu muốn in ra màn hình chẳng hạn như từ datxyz thanh datxxz thì sao ạ

ltdLê Trần ĐạtNov '14
mang[3] = 0 sẽ làm cho hàm printf khi xuất chuỗi ra sẽ ngừng khi gặp giá trị 0. Đó là quy tắc để phân biệt chuỗi và mảng ký tự trong C.

Chuối tức là mảng ký tự kết thúc bằng 0.

anh đạt ơi cái này em thắc mắc chút
mang[3] = 0 nó sẽ ngừng khi gặp giá trị 0, vậy giá trị 0 ở đây là chỗ nào ạ
với cả em thay 0 = số khác thì nó có hình như mấy ký tự rác vậy

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