dohai2105
em đọc trên mạng thấy người ta viết ‘\0’ mà ko hiêu gì mong các bác giúp đỡ
Bạn đang đọc: Ký tự ‘\0’ là gì ạ ? [Archive] – Cộng đồng C Việt
kid1232tớ cũng nb thui, mới chỉ đọc qua sách thì hình như đó là ký tự null và đứng sau chuỗi ký tự thui, có ý nghĩa như kết thúc chuỗi thì phải
conrongchautien
Kí tự ‘\0’ hay NULL có mã ASII là 0 dùng:
-Làm kí tự kết thúc chuỗi
-Giá trị của con trỏ chưa cấp phát hoặc chưa trỏ tới địa chỉ trên bộ nhớ
Ai biết thêm thì chia sẻ nha
Mandy
Kí tự ‘\0’ hay NULL có mã ASII là 0 dùng:
-Làm kí tự kết thúc chuỗi
-Giá trị của con trỏ chưa cấp phát hoặc chưa trỏ tới địa chỉ trên bộ nhớ
Còn là phần tử kết thúc mảng!
langman
Còn là phần tử kết thúc mảng!
nhảm nhí !!!!!!!!!!!!
Mandy
nhảm nhí !!!!!!!!!!!!
chứng minh đi pa
langman
Kí tự ‘\0’ hay NULL có mã ASII là 0 dùng:
-Làm kí tự kết thúc chuỗi
-Giá trị của con trỏ chưa cấp phát hoặc chưa trỏ tới địa chỉ trên bộ nhớ
chưa đạt
mởi ở mức biết chứ chưa đến mức hiểu
langman
chứng minh đi pa
chứng mình điều gì thế em ?
Mandy
chưa đạt
mởi ở mức biết chứ chưa đến mức hiểu
CHứng mnh rằng phần tử cuối của mảng không phải là ‘\0’ đi pa.Dốt mà lớn mồn quá!
langman
CHứng mnh rằng phần tử cuối của mảng không phải là ‘\0’ đi pa.Dốt mà lớn mồn quá!
(:=(|)(:=(|)(:=(|)(:=(|)(:=(|)(:=(|)
xin lỗi mà, sao bạn lỡ chửi tớ thế
nhưng mà bạn nói sai thật đó mà
còn conrongchautien thì đúng là mới đến mức biết chứ chưa lên được mức hiểu về cái này
Mandy
// abc.cpp : Defines the entry point for the console application.
//
#include “stdafx.h”
#include
using namespace std;
int main()
{
int a[10];
for (int i=0;i<10;i++)
{
a[i]=i;
}
for (int i=0;i<=12;i++)
{
if(a[i]==’\0′)
cout<<"end";
}
system(“pause”);
}
Thử chạy code này đi bạn!
langman
// abc.cpp : Defines the entry point for the console application.
//
#include “stdafx.h”
#include
using namespace std;
int main()
{
int a[10];
for (int i=0;i<10;i++)
{
a[i]=i;
}
for (int i=0;i<=12;i++)
{
if(a[i]==’\0′)
cout<<"end";
}
system(“pause”);
}
Thử chạy code này đi bạn!
hi hi, code này chả hiểu chạy thử để chứng minh điều gì cả(:P)(:P)(:P)
Mandy
for (int i=0;i<=10;i++)
{
if(a[i]==’\0′)
cout<<"end";
}
Dọc tới phần tử a[10] == \0 xuất end;
langman
for (int i=0;i<=10;i++)
{
if(a[i]==’\0′)
cout<<"end";
}
Dọc tới phần tử a[10] == \0 xuất end;
à ra vậy, sao bên trên là 12, bên dưới lại là 10
nhưng mà code sai rồi, chứng minh cũng sai rồi thì phải(:-)?(:-)?(:-)?(:-)?
BKieuPhong
Thêm dòng này:
if(a[10] == ‘\0’) cout << "what the hell";
Và nó chả hiện ra gì cả.
Nếu muốn hiểu hơn về cái kiến thức mà bạn đang cố thể hiện, hãy thử dòng lệnh này:
cout << (int)'\0';
Bạn sẽ hiểu tại sao chữ “end” lại được xuất ra trong code của bạn.
Mandy
à ra vậy, sao bên trên là 12, bên dưới lại là 10
nhưng mà code sai rồi, chứng minh cũng sai rồi thì phải(:-)?(:-)?(:-)?(:-)?
10 hay 12 o quan trọng,miễn là nó truy xuất qua phần thử thứ 10 thôi bạn.
Còn về
cout << (int)'\0'; bạn ép char về int thì dĩ nhiên nó sẽ thành 0
langman
10 hay 12 o quan trọng,miễn là nó truy xuất qua phần thử thứ 10 thôi bạn.
Còn về
cout << (int)'\0';bạn ép char về int thì dĩ nhiên nó sẽ thành 0
uh, ra vậy
nhưng mà code bạn sai rồi, thật mà
BKieuPhong
^
^ Bạn hình như càng lúc càng ko hiểu.
Ép char về int nên dĩ nhiên nó thành 0. Tức là kí tự ‘\0’ có mã ASCII là 0.
Trong code của bạn có dòng gán a[i] = i. Tức là a[0] của bạn sẽ có giá trị là 0.
Khi bạn so sánh a[i] == ‘\0’, đương nhiên dấu = sẽ xảy ra ở trường hợp i = 0.
Tóm lại, code của bạn hiện dòng end vì:
if(a[i]==’\0′)
cout<<"end";
Lệnh này sẽ thực thi ngay tại i = 0 chứ ko phải i = 10 như bạn lầm tưởng.
Nếu vẫn ngoan cố, try this:
if(a[10] == ‘\0’) cout << "what the hell";
langman
@Mandy
kĩ thuật code với mảng chưa vững đâu e à,
1. int a[10]; thì lấy đâu ra a[10]???
2. Em đổi cout<<"end"; thành cout<
3. mảng ko phải là kết thúc bằng ‘\0’ đâu em à, như thế nào thì phải do em handle chứ ko có quy ước hay quy chuẩn nào quy định về kết thúc của mảng cả
@All + Conrongchautien:
‘\0’ và NULL ko phải là 1 đâu nha
tham khảo chap VII phụ lục 1
http://forums.congdongcviet.com/showthread.php?p=189514
first_pace
@Mandy
kĩ thuật code với mảng chưa vững đâu e à,
1. int a[10]; thì lấy đâu ra a[10]???
2. Em đổi cout<<"end"; thành cout<
3. mảng ko phải là kết thúc bằng ‘\0’ đâu em à, như thế nào thì phải do em handle chứ ko có quy ước hay quy chuẩn nào quy định về kết thúc của mảng cả
@All + Conrongchautien:
‘\0’ và NULL ko phải là 1 đâu nha
tham khảo chap VII phụ lục 1
http://forums.congdongcviet.com/showthread.php?p=189514
Mấy hôm e mất mạng ko vào 4rum được. Bây h vào thấy cái pic này. Nói thật, bác langman giả nai kinh khủng (:P)
xuyenit55
@Langman:
anh giải thích dùm em sao cái dòng này lại in ra 1 ạ !
printf(“%d\n”,sizeof(‘\0’)); // in ra 1
chiga9x
CHứng mnh rằng phần tử cuối của mảng không phải là ‘\0’ đi pa.Dốt mà lớn mồn quá!
haha. bạn này chắc new member hơn cả mình^^!~. chả bik bác langman là ai^^!~
mà a langman giải thích kỹ hơn về phần này đi.
e cũng chỉ bik thể này thôi
Kí tự ‘\0’ hay NULL có mã ASII là 0 dùng:
-Làm kí tự kết thúc chuỗi
-Giá trị của con trỏ chưa cấp phát hoặc chưa trỏ tới địa chỉ trên bộ nhớ
Ai biết thêm thì chia sẻ nha
ddatduong
@Langman:
anh giải thích dùm em sao cái dòng này lại in ra 1 ạ !
printf(“%d\n”,sizeof(‘\0’)); // in ra 1
a langman bảo ‘\0’ là hằng kí tự mà, mà đã là kí tự thì có size là 1 byte mà, ko biết chuẩn chưa nhỉ 😀 🙂
G.Perelman
Chuẩn!
Bản thân nó cùng các ký tự đặc biệt khác như \n \t … chung qui lại cũng chỉ là kiểu char thôi (sizeof(char)=1 byte)
langman
hic hic, mình ko bít giải thích thế nào, nhưng mà có thể chú ý các bạn như thế này
‘a’ ‘b’ ‘c’ ‘\r’ ….. là các hằng kí tự, có kick thước 1 byte
L’a’ L’b’ L’c’ L’\r\n’ …….. là các hằng kí tự có kick thước 2 byte *** (VC++)
void main()
{
wchar_t a=L’\r\n’;
}
1, 2 ,3 ,4 ,5, 6 là các hằng int có kick thước 4 byte
1u,2u,3u…. là các hằng unsigned int có kick thứoc 4byte
…….
1. 2.3 4.9 9. là các hằng double có kick thước 8 byte
1.f 3.4f là hằng float
………………..
1ll là hằng long long
……………..
have fun!!
hãy cẩn thận khi sử dụng các hằng số nhé
soldtheworldTrời ơi. Có bạn định qua mặt langman kìa. Khai báo mảng là int a [ 10 ] mà dùng đến 12 .
peterdrew
Trời ơi. Có bạn định qua mặt langman kìa. Khai báo mảng là int a[10] mà dùng đến 12.
Vậy nếu để như vậy thì sao? Điều gì sẽ xảy ra?
VoTichSu
em đọc trên mạng thấy người ta viết ‘\0’ mà ko hiêu gì mong các bác giúp đỡ
Trả lời thẳng cho chủ, không muốn tranh luận.
(Giải thích sau đây chỉ dành riêng cho ngôn ngữ C và các ngôn ngữ cùng dòng họ với C. Những ngôn ngữ có nguồn gốc xưa hơn dùng ký hiệu khác)
Tiêu chuẩn ASCII dành ra 256 (từ 0 đến 255) số cho ký tự (trong C, loại dữ liệu này gọi là char). Trong đó có một số ký tự có hình dạng hẳn hoi và viết ra được (vd a,b, c…) và các ký tự còn lại chỉ có tính cách trừu tượng vì không viết ra được (về sau này mã ASCII mở rộng viết ra được hầu hết các lý tự).
Trong C, một ‘hằng’ ký tự được viết ra bằng cách đóng mã ký tự giữa hai dấu nháy:
vd kt A có trị là 65 và được viết ra là ‘A’
Như vậy các ký tự không ở dạng viết ra được thì viết cách nào?
Tiêu chuẩn C đặt ra phương pháp dùng escape (chéo ngược \) để diễn tả một số ký tự thông dụng :
vd ‘\n’ là ‘new line’ (xuống hàng)
và ‘\0’ là ký tự có trị 0. Lưu ý: cần phân biệt với ký tự ‘0’ có trị là 48
Theo quy ước ASCII, ký tự có trị 0 (‘\0’) còn được gọi là null (ký hiệu NUL trong ASCII). Từ null trong tiếng Anh có nghĩa là ‘không có gì cả’ (trống)
C string (chuỗi trong C):
Tiêu chuẩn C cũng đặt ra chuỗi trong C sẽ được kết thúc bằng ký tự ‘\0’ này.
Hầu hết các hàm tiêu chuẩn về string trong C sẽ dựa vào tiêu chuẩn trên để làm việc. Vì vậy, hàm strlen theo tiêu chuẩn sẽ trả về số ký tự trong chuỗi trước ký tự ‘\0’. Nếu vì lý do gì trong chuỗi của bạn cần chứa ký tự ‘\0’ trước khi kết thúc chuỗi thì bạn bắt buộc phải tự viết lấy các hàm làm việc về chuỗi. Bởi vì các hàm tiêu chuẩn không còn bảo đảm làm việc đúng như bạn muốn nữa.
Tóm lại, theo tiêu chuẩn, ký tự ‘\0’ được C dùng để đánh dấu kết thúc chuỗi. Nhưng nếu bạn không muốn theo tiêu chuẩn thì cũng không ai cấm.
clamvn
Bổ sung thêm bài viết của VoTichSu :
Kí tự ‘\0’ rất quan trọng trong chuỗi khi dùng các hàm trong thư viện string.h.
Nếu ko có ‘\0’ thì khi các hàm đọc chuỗi sẽ chạy ko ngừng trên bộ nhớ đến khi gặp ‘\0’ mới thôi.
Ví dụ : chuỗi str=”congdongCviet” trên bộ nhớ đc lưu
congdongCviet\023EDFHYRRRADSWCVBFGiatriMotchuoikha c\0
Nếu cuối chuỗi str ko có ‘\0’, khi gọi strlen() thì nó sẽ lấy độ dài của “cong……khac”.
Vì vậy việc gán phần tử cuối của chuỗi là rất quan trọng(nhưng ko bắt buộc )nhất là trong cấp phát động
Ví dụ :
Muốn có 1 chuỗi 10 phần tử, người ta luôn cấp phát :
str=(char *) malloc(sizeof(char)*(10+1));
str[10]=’\0′;
Trường hợp ngoại lệ: Nếu các bạn xử lý tốt việc lưu trữ trên bộ nhớ thì ‘\0’ là ko cần thiết vì số lượng byte là xác định và trong trường hợp này thì sẽ ko ai dùng strlen().
@mandy
khi nói đến ‘\0’ thì người ta nói đến chuỗi, chẳng ai nói đến mảng cả.
@langman
Dạo này bạn langman chuyển nghề sang bán thịt nai khô rồi à ?
peterdrew
@mandy
khi nói đến ‘\0’ thì người ta nói đến chuỗi, chẳng ai nói đến mảng cả.
Vậy cho Peter hỏi thêm nhé: Chuỗi có phải là mảng không? Hoang mang quá.
mp121209
Vậy cho Peter hỏi thêm nhé: Chuỗi có phải là mảng không? Hoang mang quá.
Chuỗi là chuỗi(string) mà mảng là mảng(array). Không hề có sự lẫn lộn khái niệm này được!
Trong C chỉ có kiểu mảng, không có chuỗi. Vì thế khi ta nói chuỗi, tức là mảng các kí tự!
Trong C++ có kiểu string, đó là kiểu chuỗi!
#include
#include
using namespace std;
int main() {
// string of C++
string str = “abcdekjfad;daf”;
str[3] = ‘\0’;
cout << str << endl;
// array of characters, C-style
char cstr[] = “Hello, everybody there!”;
cstr[3] = ‘\0’;
cout << cstr << endl;
return 0;
}
Hi vọng không ai nhầm lẫn khái niệm!
clamvn
Chưa kịp trả lời pêtr thì mp121209 trả lời rồi.
Trong C gọi chuỗi để tưởng niệm kiểu “string” chứ đúng như mp12109 nói thì chuỗi trong C là mảng các kí tự.
Vì các làm việc của các hàm trong string.h như mình nói ở trên nên trong mảng kí tự thường kết thúc bởi ‘\0’
langman
Chuỗi là chuỗi(string) mà mảng là mảng(array). Không hề có sự lẫn lộn khái niệm này được!
Trong C chỉ có kiểu mảng, không có chuỗi. Vì thế khi ta nói chuỗi, tức là mảng các kí tự!
Trong C++ có kiểu string, đó là kiểu chuỗi!
#include
#include
using namespace std;
int main() {
// string of C++
string str = “abcdekjfad;daf”;
str[3] = ‘\0’;
cout << str << endl;
// array of characters, C-style
char cstr[] = “Hello, everybody there!”;
cstr[3] = ‘\0’;
cout << cstr << endl;
return 0;
}
Hi vọng không ai nhầm lẫn khái niệm!
Trong C chỉ có kiểu mảng, không có chuỗi << xin lỗi vậy thì mp lại nhầm rồi
theo C++ ref
int strcmp ( const char * str1, const char * str2 );
Compare two strings
Compares the C string str1 to the C string str2.
clamvn
Mình nghĩ bản chất của chuỗi trong C là mảng. Vì cả 2 cái đều có cách khi báo như nhau (khác nhau kiểu )
còn cách gọi là để phân biệt, để người đọc ko bị nhầm lẫn. Đó đề đó nămf ở ngôn ngữ thôi, chứ đối với máy thì nó coi là một loại .
langman
2. ngoài ra, mp nên tìm hiểu thêm về string.h
3. và dấu “”
dựa vào 3 bằng chứng trên hoàn toàn kết luận trong C có kiểu dữ liệu chuỗi
còn chuỗi kí tự trong C có đặc điểm riêng, đó là cái riêng của C
chứ kết luận C ko có chuỗi lại là hoàn toàn sai lầm
vietduc
Chưa kịp trả lời pêtr thì mp121209 trả lời rồi.
Trong C gọi chuỗi để tưởng niệm kiểu “string” chứ đúng như mp12109 nói thì chuỗi trong C là mảng các kí tự.
Vì các làm việc của các hàm trong string.h như mình nói ở trên nên trong mảng kí tự thường kết thúc bởi ‘\0’
Mảng thì kết thúc bằng gì chả được.
Nói đến một kiểu dữ liệu thì mình hay nghĩ đến một class (struct) với các phương thức đặc trưng (có thể ko có với các kiểu dữ liệu ng tố như int, …):
String là một kiểu dữ liệu
char* là một kiểu dữ liệu
trong C chỉ cố tình làm cho người ta tưởng tượng ra một kiểu dữ liệu sử lí chuỗi cho dễ dùng(nghĩ thế)
peterdrew
String là một kiểu dữ liệu
String không phải là một kiểu dữ liệu đâu em. Em có thể tìm hiểu thêm tại sao lại như vậy?
@Thắng: Em nên làm rõ cụm từ “chuỗi là chuỗi (string) và mảng là mảng (array)”, khẳng định của em như trên càng thêm chung chung và anh nghĩ là sai đấy.
mp121209
string của C++ là một kiểu dữ liệu hoàn toàn độc lập, nó không hề có liên quan đến kiểu strings trong C. Trong C, string chỉ đơn thuần là một mảng kí tự, không hơn không kém! Đó không phải là một kiểu dữ liệu độc lập, đó là một trường hợp riêng của mảng mà thôi
1.2.7 Strings
Strings are simply an array of characters encapsulated in double quotes. At the end of the string a null character is appended.
Examples:
“\x41” and “A” are the same string.
char fred[25]=”He said, \”Go away!\””;
The value at fred[9] is a double quote. The value at fred[20] is the null character.
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/1.2.html#strings
@: ‘\0’ trong string c++ chỉ là một kí tự bình thường, ‘ ‘ space mà thôi, không phải là kí tự kết thúc cho một dãy các kí tự như trong C
peterdrewThấy Thắng và một số ít bạn cứ Tóm lại mảng là mảng còn chuỗi là chuỗi, giờ lại nói chuỗi là trường hợp riêng của mảng ? ? ? Hơn thế những bạn hiểu thế nào là một kiểu tài liệu nhỉ ?
mp121209
Thấy Thắng và một số bạn cứ kết luận mảng là mảng còn chuỗi là chuỗi, giờ lại nói chuỗi là trường hợp riêng của mảng??? Hơn thế các bạn hiểu thế nào là một kiểu dữ liệu nhỉ?
Em đọc rất nhiều tài liệu tiếng Việt về C, các thầy giáo thường đưa ra khái niệm chuỗi, thuật ngữ tương đương trong tiếng Anh là string. Nhiều người giải thích, string là mảng các kí tự, nhiều người không giải thích, đó là vấn đề của các giáo viên! Trong C hoàn toàn không có khái niệm chuỗi, chỉ có trong C++ mới có khái niệm chuỗi như là một kiểu dữ liệu. Cái chuỗi mà mọi người thường gọi trong C là một mảng kí tự liên tiếp, không phải là kiểu dữ liệu!
char* str = “abcd”; chỉ đơn giản là con trỏ kiểu kí tự, trỏ lên một tập hợp các kí tự liên tiếp nhau, cuối dãy có một kí tự định nghĩa là ‘\0’ để nhận biết mà thôi!
string str = “abcd”; thì lại hoàn toàn khác!
vietduc
String không phải là một kiểu dữ liệu đâu em. Em có thể tìm hiểu thêm tại sao lại như vậy?
Tại sao vậy, hay là string.
Chưa hiểu ý đồ 1 số anh.
peterdrewEm có chắc như đinh rằng trong C + + thì String là một kiểu tài liệu không ? Còn anh Tóm lại ngang về yếu tố anh nói ở trên đó là : Chuỗi là một mảng những ký tự ( Như vậy nếu ai nói rằng ” chuỗi là chuỗi mà mảng là mảng, hai cái trọn vẹn khác nhau ” thì anh sẽ cho là sai ! ). Còn yếu tố C hay C + + có khái niệm chuỗi hay không thì anh cũng chứng minh và khẳng định luôn là cả hai đều có. Em hoàn toàn có thể làm rõ cái String trong C + + nó là cái gì không ?
khoaimonÝ kiến của em ngược với anh Petedrew nhưng jo em đang bận nên tí nữa em lý giải, em nhận chỗ trước .
langman
Bạn hiểu “Tôi yêu việt nam” trong C là gì ? là 1 mảng ?
đây là 1 hằng chuỗi
Chuỗi trong C có
+ hằng giá trị
+ tập hợp giá trị
+ thao tác trên dữ liệu
+ khả năng khai báo biến thể hiện
vậy bạn lấy gì khẳng định C ko có kiểu chuỗi ?
“” dùng để làm gì ?
tại sao các tài liệu đều nói đến C String ?
vietduc
Em có chắc chắn rằng trong C++ thì String là một kiểu dữ liệu không? Còn anh kết luận ngang về vấn đề anh nói ở trên đó là: Chuỗi là một mảng các ký tự (Như vậy nếu ai nói rằng “chuỗi là chuỗi mà mảng là mảng, hai cái hoàn toàn khác nhau” thì anh sẽ cho là sai!). Còn vấn đề C hay C++ có khái niệm chuỗi hay không thì anh cũng khẳng định luôn là cả hai đều có. Em có thể làm rõ cái String trong C++ nó là cái gì không?
oh, thế thì anh phản chứng thôi, xem sao, string trong C++ là một class <=> đối tượng
em nghĩ là một kiểu dữ liệu thì phải có thể hiện ra một đối tượng (biến)
ví dụ:
int a;
int là kiểu dữ liệu a là một thể hiện
string s;
cũng vậy.
Trong C làm gì có cái nào như thế để khai báo chuỗi, chỉ có char* thôi, compile cũng chỉ lỗi báo là char*
langman
Trong C làm gì có cái nào như thế để khai báo chuỗi, chỉ có char* thôi, compile cũng chỉ lỗi báo là char*
thật thế ko ? [:-([:-([:-(
homanhduc
Theo như em được học và hiểu thì :
+Trong C++: string là một object được thêm vào thư viện std
+Trong C : họ gọi kiẻu chuỗi là C-string. Khai báo như mảng ký tự.
Không biết có phải vì string chỉ là object hay không mà khi em khai báo nó không bôi đen(em dùng codeblocks).
Của diễn đàn thì tag string khác màu
#include
#include
using namespace std;
int main()
{
string s;
char mang[] = “hello”;
}
P/s : Chỉ là học và hiểu theo ý riêng, có gì mong anh em chỉ giúp
langman
Theo như em được học và hiểu thì :
+Trong C++: string là một object được thêm vào thư viện std
+Trong C : họ gọi kiẻu chuỗi là C-string. Khai báo như mảng ký tự.
Không biết có phải vì string chỉ là object hay không mà khi em khai báo nó không bôi đen(em dùng codeblocks).
Của diễn đàn thì tag string khác màu
#include
#include
using namespace std;
int main()
{
string s;
char mang[] = “hello”;
}
P/s : Chỉ là học và hiểu theo ý riêng, có gì mong anh em chỉ giúp
string ko phải là built-in data type nên nó ko được highlight
sửa lại ko phải là object là 1 class
std::string là 1 class
homanhduc
oh, thế thì anh phản chứng thôi, xem sao, string trong C++ là một class <=> đối tượng
em nghĩ là một kiểu dữ liệu thì phải có thể hiện ra một đối tượng (biến)
ví dụ:
int a;
int là kiểu dữ liệu a là một thể hiện
string s;
cũng vậy.
Trong C làm gì có cái nào như thế để khai báo chuỗi, chỉ có char* thôi, compile cũng chỉ lỗi báo là char*
Tớ nghĩ array cũng là một dạng pointer, nên nó báo lỗi thế.
P/s: Đừng chém em :d
vietduc
thật thế ko ? [:-([:-([:-(
có thể kiến thức em vẫn hạn hẹp (:-)$
Mong được chỉ giáo thêm(:-)??(:-)??
// thật là đông vui
mp121209
@ anh Peter: string trong C++ là một kiểu dữ liệu, 32 bytes <- sizeof(string);
@ langman: “” là một mảng kí tự, kí tự đầu tiền bằng ‘\0’
langman
có thể kiến thức em vẫn hạn hẹp (:-)$
Mong được chỉ giáo thêm(:-)??(:-)??
char * là 1 gốc, có n cái dẫn xuất từ char * như là
char [100]
char [101]
const char *
……v…v
trình biên dịch cũng ko phải báo lỗi mỗi char * mà còn n th khác nữa
langman
@ anh Peter: string trong C++ là một kiểu dữ liệu, 32 bytes <- sizeof(string);
@ langman: “” là một mảng kí tự, kí tự đầu tiền bằng ‘\0’
1. std::string đúng là 1 kiểu dữ liệu
2.”” mình nói ko phải là hằng chuỗi rỗng, mà mình muốn hỏi bạn về dấu “” để làm gì ?
mp121209@ langman : ” ” là gì thực sự mình không biết, bạn lý giải đi !
khoaimon
@anh Petedrew: em nói lý do của em nhé!
Trong C++:
string là 1 mảng dữ liệu kiểu char (cái này em ok).
nhưng xét về các góc độ khác như: trong C++ string là object và cách làm việc với nó cũng khác với mảng. Với string chúng ta có rất nhiều thao tác làm việc với nó như cộng,….còn với mảng thì không thể mà chỉ có thể lấy độ dài của mảng mà thôi. Nên tổng quát chung lại em vẫn giữ ý kiến là 2 cái này khác nhau.
EM cũng không nghiên cứu nhiều về C++ nên có ji anh và mọi người chỉ giáo 😀
clamvn
Mảng thì kết thúc bằng gì chả được.
Nói đến một kiểu dữ liệu thì mình hay nghĩ đến một class (struct) với các phương thức đặc trưng (có thể ko có với các kiểu dữ liệu ng tố như int, …):
String là một kiểu dữ liệu
char* là một kiểu dữ liệu
trong C chỉ cố tình làm cho người ta tưởng tượng ra một kiểu dữ liệu sử lí chuỗi cho dễ dùng(nghĩ thế)
Ở đâu ra cái kiểu dữ liệu ” char * ” trong C vậy ? Viết char *c, nghĩa là hiểu c là pointer kiểu char chứ làm gì có kiểu dư liệu char *.
Đúng là mảng kết thúc bằng gì cũng dc miễn đừng vượt quá giới hạn. Nhưng trong mảng kí tự (hay gọi là chuỗi ) thì là trường hợp đặc biệt, kết thúc phải bằng ‘\0’.
Cách gọi chuỗi trong C ,cũng như câu nói “mày có xe honda ko ?” Ý câu hỏi là mày có xe 2 bánh gắn máy và chạy dc ko chứ ko phải hỏi là có xe hiệu honda hay ko.Nhưng khi nó thành thói quen thì khi gọi vậy sẽ dễ hiểu hơn cho người đọc.
Còn việc viết : char str[]=”congdongCviet”, mà máy vẫn hiểu như str[]={‘c’,’o’,’n’,….,’e’,’t’};
là vì có thể mỗi kí tự đc lưu trên 1 byte, và khi đặt sát nhau trong dấu ” ” ko ảnh hưởng đến việc lưu trữ trên bộ nhớ nên trong C có thể khai báo trực tiếp kiểu mảng kí tự với ” “.
Giống như mảng số tự nhiên (dãy số ), trên bộ nhớ các số trong dãy sẽ dc lưu thành từng bloc 4 bytes liên tiếp nhau.
vietduc
Ở đâu ra cái kiểu dữ liệu ” char * ” trong C vậy ? Viết char *c, nghĩa là hiểu c là pointer kiểu char chứ làm gì có kiểu dư liệu char *.
Đúng là mảng kết thúc bằng gì cũng dc miễn đừng vượt quá giới hạn. Nhưng trong mảng kí tự (hay gọi là chuỗi ) thì là trường hợp đặc biệt, kết thúc phải bằng ‘\0’.
Sao cậu không viết là char* c; đi
Nếu kết thúc không bằng ‘\0’ thì có sao không — chả sao
// đoạn dưới không hiểu
khangphamngoc90Hơ, lâu lâu không vào sao anh langman lại bị ban thế nhỉ ? ? ? ( 8 – ) >
birthis
Đúng là vui như hội, cho em tham gia với 😀
Theo em thì:
1. Trong C có string. Ví dụ như: “Cộng đồng C Việt” đây là 1 string.
Và để lưu trữ string này trong C, ta có thể khai báo:
char str[50] = “Cộng đồng C Việt”;
– Vấn đề là ở cách lưu trữ xâu của các ngôn ngữ khác nhau. Trong C thì 1 xâu được lưu trữ bằng 1 mảng các ký tự được sắp xếp liên tiếp, được đánh dấu kết thúc xâu bởi ký tự ‘\0’, và dùng 1 con trỏ trỏ đến đầu xâu để định vị xâu đó.
2. Xâu trong C++ thì cũng tương tự: “Cộng đồng C Việt” là 1 xâu, và ta có thể dùng cách lưu trữ xâu này như C, hoặc là dùng kiểu dữ liệu string.
Đối với kiểu string thì ta chẳng cần quan tâm nó lưu trữ xâu này như thế nào ( có thể là lưu thành 1 mảng các ký tự liên tiếp như trong C hoặc là lưu rời rạc,…), ta chỉ cần biết là nó đã lưu được xâu “Cộng đồng C Việt”.
– Vì vậy em nghĩ là C, C++, C# cái nào mà chả có xâu, chẳng qua là cách lưu trữ xâu của mỗi ngôn ngữ khác nhau thôi.
clamvn
Mảng thì kết thúc bằng gì chả được.
Nói đến một kiểu dữ liệu thì mình hay nghĩ đến một class (struct) với các phương thức đặc trưng (có thể ko có với các kiểu dữ liệu ng tố như int, …):
String là một kiểu dữ liệu
char* là một kiểu dữ liệu
trong C chỉ cố tình làm cho người ta tưởng tượng ra một kiểu dữ liệu sử lí chuỗi cho dễ dùng(nghĩ thế)
Sao cậu không viết là char* c; đi
Nếu kết thúc không bằng ‘\0’ thì có sao không — chả sao
// đoạn dưới không hiểu
Không dùng ‘\0’ thì có sao lắm chứ. Mình đã nói hết bên trên, cũng như mọi người đã nói,chẳng ai phủ định việc kết thúc chuỗi bằng ‘\0’, ngoại trừ bạn.
char* c : nghĩa là c có kiểu dữ liệu là char* sao ?(:X)
vietduc
Không dùng ‘\0’ thì có sao lắm chứ. Mình đã nói hết bên trên, cũng như mọi người đã nói,chẳng ai phủ định việc kết thúc chuỗi bằng ‘\0’, ngoại trừ bạn.
char* c : nghĩa là c có kiểu dữ liệu là char* sao ?(:X)
Vừa bảo kết thúc mảng bằng ‘\0’ h lại bảo kết thúc chuỗi bằng ‘\0’ tớ vẫn giữ ý: trong C không có chuỗi mà, chỉ có mảng, kết thúc mảng là gì cũng được quan tâm làm gì. còn nếu mượn mảng để làm việc giống như chuỗi thì mới quan tâm cái ‘\0’ nó ở chỗ nào trong mảng (không nhất thiết ở cuối cùng của mảng)
có bao giờ bạn truyền char* vào 1 hàm nào đó chưa, pointer là 1 kiểu dữ liệu, 32bit thì phải, chưa cài OS 64 nên chưa bít có pointer lớn hơn ko
clamvn
Vừa bảo kết thúc mảng bằng ‘\0’ h lại bảo kết thúc chuỗi bằng ‘\0’ tớ vẫn giữ ý: trong C không có chuỗi mà, chỉ có mảng, kết thúc mảng là gì cũng được quan tâm làm gì. còn nếu mượn mảng để làm việc giống như chuỗi thì mới quan tâm cái ‘\0’ nó ở chỗ nào trong mảng (không nhất thiết ở cuối cùng của mảng)
có bao giờ bạn truyền char* vào 1 hàm nào đó chưa, pointer là 1 kiểu dữ liệu, 32bit thì phải, chưa cài OS 64 nên chưa bít có pointer lớn hơn ko
Em đâu có nói là mảng kết thúc bằng ‘\0’, mà là mảng kí tự kết thúc bằng ‘\0’.
Em thì ko biết truyền char* vào 1 hàm là sao, em chỉ biết nếu khai báo char *ham(); khi kết thúc hàm, giá trị của hàm sẽ là giá trị tại vùng nhớ mà hàm trỏ lên hay hàm trả về là 1 địa chỉ trên bộ nhớ.
nói như bạn thì sizeof(char *) = 4 bytes = 32 bits à ? (:X)[:-X)
Ngâm cứu lại bài “Bản chất con trỏ (từ cơ bản đến nâng cao” của langman đi.
vietduc
Em đâu có nói là mảng kết thúc bằng ‘\0’, mà là mảng kí tự kết thúc bằng ‘\0’.
Em thì ko biết truyền char* vào 1 hàm là sao, em chỉ biết nếu khai báo char *ham(); khi kết thúc hàm, giá trị của hàm sẽ là giá trị tại vùng nhớ mà hàm trỏ lên hay hàm trả về là 1 địa chỉ trên bộ nhớ.
nói như bạn thì sizeof(char *) = 4 bytes = 32 bits à ? (:X)[:-X)
Ngâm cứu lại bài “Bản chất con trỏ (từ cơ bản đến nâng cao” của langman đi.
char a[100]=”abc”;
a là 1 mảng char đúng không, a[99] là phần tử kết thúc mảng char đúng không
thế thì cậu bảo a[99]=’\0′ đúng không (không thể cãi vì đã nói là kết thúc của mảng char)
=> sai lòi
còn cái a[3] đúng là ‘\0’ nhưng nó có kết thúc mảng 100 phần tử kia đâu, đằng sau nó còn đầy
in mảng 1 cách chính thống là dùng for in tất cả các phần tử kia ra.
Cậu đọc lại bài kia đi đúng hơn, không ti hả, code nhiều coi
clamvn
char a[100]=”abc”;
a là 1 mảng char đúng không, a[99] là phần tử kết thúc mảng char đúng không
thế thì cậu bảo a[99]=’\0′ đúng không (không thể cãi vì đã nói là kết thúc của mảng char)
=> sai lòi
còn cái a[3] đúng là ‘\0’ nhưng nó có kết thúc mảng 100 phần tử kia đâu, đằng sau nó còn đầy
in mảng 1 cách chính thống là dùng for in tất cả các phần tử kia ra.
Cậu đọc lại bài kia đi đúng hơn, không ti hả, code nhiều coi
(:))(:))(:))(:))(:))(:))(:))(:))(:))
khai báo char a[100]=”abc” là ý nói là tôi cần 100 bytes trên bộ nhớ, trong đó 3 bytes đầu có giá trị abc. Dĩ nhiên a[3]= ‘\0’ vì nó kết thúc cái chuỗi hay mảng kí tự của bạn nhập vào.
cái a[99] chỉ nó lên giá trị ở vị trí 100, mà hiện giờ nó chưa có gì., chứ nó đâu phải phần tử cuối của chuỗi.
thử char a[2]=”abc” xem nó bị gì ? hay char a[2]=”ab”.
Ai cũng biết 1 điều khi sử dụng chuỗi là độ lớn của bộ nhớ chứa chuỗi luôn phải lớn hơn 1 giá trị với độ lớn của chuỗi, và giá trị đó là ‘\0’.
Bạn có biết trên bộ nhớ nó nhớ chuỗi như thế nào ko ?
vietduc
(:))(:))(:))(:))(:))(:))(:))(:))(:))
khai báo char a[100]=”abc” là ý nói là tôi cần 100 bytes trên bộ nhớ, trong đó 3 bytes đầu có giá trị abc. Dĩ nhiên a[3]= ‘\0’ vì nó kết thúc cái chuỗi hay mảng kí tự của bạn nhập vào.
cái a[99] chỉ nó lên giá trị ở vị trí 100, mà hiện giờ nó chưa có gì., chứ nó đâu phải phần tử cuối của chuỗi.
thử char a[2]=”abc” xem nó bị gì ? hay char a[2]=”ab”.
Ai cũng biết 1 điều khi sử dụng chuỗi là độ lớn của bộ nhớ chứa chuỗi luôn phải lớn hơn 1 giá trị với độ lớn của chuỗi, và giá trị đó là ‘\0’.
Bạn có biết trên bộ nhớ nó nhớ chuỗi như thế nào ko ?
Thật là nguy hiểm(:-)h(:-)h(:-)h(:-)h(:-)h
clamvn
Nguy hiểm như thế nào thì bạn hãy nói. Đừng làm ra vẻ như vậy, ko biết ai hơn ai đâu bạn ạ.
Khai báo char a[10]=”12345″;
trên bộ nhớ 12345\0—-&ée§çfjj,,gdz–djf&$? ( “-” là khoảng trống của phần nhớ chưa dùng mà ko ai có thể xâm phạm dc) Khi đó ‘\0’ sẽ tự động dc gán vào vùng nhớ ở vị trí sau cùng của chuỗi (nếu còn vùng nhớ )
nếu a[10]=”0123456789″
trên bộ nhớ : 0123456789&é!?$jhds ( thế là ko có ‘\0’ ở cuối, vì làm gì còn chỗ nào ) nếu lúc này mà gọi strlen() là héo.
Vì vậy khi làm việc với chuỗi, nếu ko biết chính xác độ dài thì người ta thường chọn 1 độ dài lớn để trừ hao, nếu biết rõ độ dài l thì thường họ sẽ khai báo a[l+1] và tức khắc gán luôn a[l]=’\0′
vietduc
Nguy hiểm như thế nào thì bạn hãy nói. Đừng làm ra vẻ như vậy, ko biết ai hơn ai đâu bạn ạ.
Khai báo char a[10]=”12345″;
trên bộ nhớ 12345\0—-&ée§çfjj,,gdz–djf&$? ( “-” là khoảng trống của phần nhớ chưa dùng mà ko ai có thể xâm phạm dc) Khi đó ‘\0’ sẽ tự động dc gán vào vùng nhớ ở vị trí sau cùng của chuỗi (nếu còn vùng nhớ )
nếu a[10]=”0123456789″
trên bộ nhớ : 0123456789&é!?$jhds ( thế là ko có ‘\0’ ở cuối, vì làm gì còn chỗ nào ) nếu lúc này mà gọi strlen() là héo.
Vì vậy khi làm việc với chuỗi, nếu ko biết chính xác độ dài thì người ta thường chọn 1 độ dài lớn để trừ hao, nếu biết rõ độ dài l thì thường họ sẽ khai báo a[l+1] và tức khắc gán luôn a[l]=’\0′
Người ta thick đặt ‘\0’ ở chỗ nào chả được vì nó là 1 kí tự, đang nói đến mảng chả liên quan gì đến cái gọi là chuỗi(:-)h(:-)h
clamvn
Cái tựa đề topic là gì ?
Mình đã nói rồi, trong mảng thì ko cần có ‘\0’ nhưng trường hợp đặc biệt mảng kí tự (hay còn gọi là chuỗi ) thì cần.
Hình như bạn chẳng đọc gì mình viết, thế thì tranh luận làm gì.
Thôi kết thúc tại đây, ko nên chiếm dụng quá tài nguyên của forum.
conga2012Mình thấy mọi người chém nhau vì chủ đề này ác quá. Theo mình nghĩ thì cái ‘ \ 0 ‘ này chỉ để báo kết thúc 1 xâu, chứ có phải đâu là kết thúc 1 mảng. Nếu độ dài của xâu đủ với số thành phần của mảng thì ký tự ‘ \ 0 ‘ cũng không Open, và cái mảng ấy cũng không gọi là 1 xâu .
vBulletin ® Version 4.2.2, Copyright © 2021 vBulletin Solutions, Inc. All rights reserved. Administer by Kevin Hoang
Source: https://ku11.io
Category: Toplist