30/09/2018, 16:05

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

e có chương trình sau:

#include <stdio.h>
#include <conio.h>
#include <string.h>

int main(){
	char s[255], s1[255];
	printf("Nhap xau s: ");
	do{
		gets(s);
	} while(strlen(s)==0);
	printf("Xau s ban vua nhap la: %s
",s);
	int n=strlen(s);
	printf("Xau "%s" co do dai la: %d
",s,n);
	char str[n-1];
	for(int i=0;i<n;i++)
		str[i]=s[n-i-1];
	printf("Xau dao nguoc cua xau "%s" la: "%s"
",s,str);
	getch();
	return 0;
}

chỗ

	char str[n-1];

nếu e để là

	char str[n];

thì chuỗi in ra toàn có kí tự lạ thừa ở cuối, e không hiểu tại sao, mong ai đó giải thích cho e với ạ. em cảm ơn

minh tran viết 18:19 ngày 30/09/2018

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].

Sáng Béo viết 18:20 ngày 30/09/2018

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

BaoLe viết 18:20 ngày 30/09/2018

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.

Nguyễn Minh Dũng viết 18:13 ngày 30/09/2018

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.

Sáng Béo viết 18:20 ngày 30/09/2018

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 ạ?

Nguyễn Minh Dũng viết 18:14 ngày 30/09/2018

tức là nếu xâu s là “abc” thì n sẽ là 3 đúng ko ạ.

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.

Sáng Béo viết 18:13 ngày 30/09/2018

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] ạ?

Nguyễn Minh Dũng viết 18:09 ngày 30/09/2018

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] ạ?

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.

Sáng Béo viết 18:10 ngày 30/09/2018

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 ạ?

Nguyễn Minh Dũng viết 18:15 ngày 30/09/2018

Chính xác rồi Sáng 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.

Sáng Béo viết 18:11 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:07 ngày 30/09/2018

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é.

Sáng Béo viết 18:20 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:10 ngày 30/09/2018

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.

minh tran viết 18:19 ngày 30/09/2018

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 ???

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

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.

Sáng Béo viết 18:11 ngày 30/09/2018

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.

Sáng Béo viết 18:18 ngày 30/09/2018

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 ạ?

Nguyễn Minh Dũng viết 18:09 ngày 30/09/2018

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.

Sáng Béo viết 18:15 ngày 30/09/2018

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ì

Bài liên quan
0