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
Bài liên quan
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].
thế hàm strlen có tính luôn kí tự kết thúc chuỗi không ạ?
không đâu pạn.nội dung hàm strlen là:
Giá trị của i chính là độ dài của chuỗi đang xét tới.
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ủastrlen
rồi đấy.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 ạ?
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.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.
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 ạ?
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.
à, a làm thêm video vè con trỏ và chuỗi đi a.
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é.
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
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.
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 ???
Cái này là em nhầm lẫn kiến thức rồi.
Index
khác vớisize
.Index
bắt đầu từ 0. Thế nênstr[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.
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.
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 ạ?
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.
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ì