Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Sự khác biệt trong khi in một chuỗi ra màn hình

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    78

    Mặc định Sự khác biệt trong khi in một chuỗi ra màn hình

    - Mình tình cờ có ngồi code một đoạn code sau:
    Yêu cầu đề bài: in ra từng ký tự của một chuỗi cho trước ra màn hình theo từng dòng khác nhau...

    - Thì mình phát hiện một điều hơi lạ (so với mình thôi) như sau do "ẩu" tí xíu:

    Code1:cái này ko có jì đáng bàn..đúng rồi!
    C Code:
    1. #include <iostream.h>
    2.  
    3. int main()
    4. {
    5.     char *s="congdongcviet";
    6.     for(;*s!='\0';++s)
    7.     {
    8.         cout<<*s<<endl;
    9.     }
    10.     return(0);
    11. }

    Code 2: xem cái này nhé...
    C Code:
    1. #include <iostream.h>
    2.  
    3. int main()
    4. {
    5.     char *s="cviet";
    6.     for(;*s!='\0';++s)
    7.     {
    8.         cout<<s<<endl; //ko có dấu *
    9.     }
    10.     return(0);
    11. }

    sau khi run nó in ra màn hình thế này:
    cviet
    viet
    iet
    et
    t
    =>Mình cũng có suy nghĩ nhưng thôi đem lên đây xem các bạn có ý kiến như thế nào?Cơ chế hoạt động của nó thế nào nhỉ....cái Code 2 ấy?Tuy đơn giản nhưng mình muốn hiểu cho tới...
    No way, No success..

  2. #2
    Ngày gia nhập
    01 2008
    Bài viết
    41

    Một cái là in string, 1 cái là in character, có gì lạ đâu nhỉ???
    Khi in theo kiểu 2: cái cout ( tương đương printf đúng không nhỉ ), nếu nó tương đương printf thì khi cậu ++s thì nó sẽ in từ vị trí con trỏ s đang trỏ đến khi gặp '\0', thế nên nó ra cái
    cviet
    viet
    iet
    et
    t

  3. #3
    Ngày gia nhập
    03 2008
    Bài viết
    78

    - cái Code đầu thì nó in ra giá trị của character mà pointer đang trỏ tới đúng hok?caí này ok!Nhưng

    Khi in theo kiểu 2: cái cout ( tương đương printf đúng không nhỉ ), nếu nó tương đương printf thì khi cậu ++s thì nó sẽ in từ vị trí con trỏ s đang trỏ đến khi gặp '\0', thế nên nó ra cái
    @:Ủa có chuyện đó nữa hả cậu?ko! tớ hỏi thiệt...Nhưng ai có thể giải thích cái này một cách "hàn lâm" ko nhỉ?Lần đầu tiên bị "gài" nên hơi choáng váng...Giống như mấy cái and or đó....Tóe lửa luôn chứ bộ.
    No way, No success..

  4. #4
    Ngày gia nhập
    03 2008
    Bài viết
    57

    bạn huybka nói đúng đó. s là một con trỏ chuỗi. Nó sẽ mặc định giữ địa chỉ của ký tự đầu tiên trong chuỗi . Khi bạn xuất là *s nó sẽ xuất ra giá trị tại vị trí mà con trỏ s đang giữ. cứ mỗi lần ++s thì địa chỉ mà s đang giữ tăng lên 1 và gán trở lại cho s. Còn cout<< s; thì nó sẽ xuất ra tất cả các giá trị từ vị trí con trỏ s đang giữ cho đến hết chuỗi.
    Bạn này có thể thực hành câu lệnh này sẽ rõ cơ chế con trỏ chuỗi s
    Code:
    for(int i = 0; i< strlen(s); i++)
    {
    cout << *(s+i) << " = " << s[i] << endl;
    }

  5. #5
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    cái cout ( tương đương printf đúng không nhỉ )
    cout khác printf.
    Cái này vì toán tử << đã được định nghĩa lại trong C++, nó tương đương với
    C++ Code:
    1. std::ostream& operator << (const char* s){
    2.   for(*s != '\0'; ++s)
    3.     cout << *s;
    4. }
    Ý nghĩa là như vậy còn đúng hàm của nó thì có cả template và rất nhiều cái phức tạp nữa, khi học về I/O và Locale sẽ hiểu rõ về phần này.
    Cậu muốn check thì cứ thử in ra địa chỉ của các phần tử của 1 mãng char cậu sẽ hiểu ví dụ :
    C++ Code:
    1. #include <iostream>
    2.  
    3. int main(){
    4.   int arrI[4] = {1,2,3,4};
    5.   std::cout << "Interger-array addresses :\n";
    6.   for(int x = 0; x < 3; ++x){
    7.     std::cout << &arrI[x] << " ";
    8.   }
    9.   std::cout << "\nWell, but it not work for character huh!!!\n";
    10.   char arrC[4] = {'1','2','3', '\0'};
    11.   for(int x = 0; x < 3; ++x){
    12.     std::cout << &arrC[x] << " ";
    13.   }
    14.   std::cout << "\nReal character-array addresses :\n";
    15.   for(int x = 0; x < 3; ++x){
    16.     std::cout << reinterpret_cast<int*>(&arrC[x]) << " ";
    17.   }
    18.  
    19.   std::cout << '\n';
    20.   return 0;
    21. }

  6. #6
    Ngày gia nhập
    12 2007
    Bài viết
    48

    Arrow Sự khác biệt trong khi in một chuỗi ra màn hình

    Em nghĩ mặc định địa chỉ của 1 integer là 1 int*, mặc định địa chỉ của 1 char là 1 char*, thế nên mỗi lần cout địa chỉ của 1 char thì phải ép nó thành int* nó mới ra địa chỉ (vì địa chỉ phải là chuỗi số thập lục).

    Code:
    #include <iostream.h>
    
    int main()
    {
    	int x = 1;
    	cout << &x;
    	cout << endl;
    
    	char y = 'A';
    	cout << reinterpret_cast<int*>(&y);
    	cout << endl;	
    
    	return 0;
    }
    Nhưng vẫn không hiểu tại sao chỗ này lại in ra 123 23 3
    Code:
    char arrC[4] = {'1','2','3', '\0'};
    for(int x = 0; x < 3; ++x)
    {
        std::cout << &arrC[x] << " ";
    }
    "what you don't use you don't pay for" (Bjarne Stroustrup).

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Nhưng vẫn không hiểu tại sao chỗ này lại in ra 123 23 3
    Bởi vì << là 1 toán tử được overloading lại trong C++, đọc kĩ đoạn anh nói ở trên. Khi em học về locale và class I/O thì em sẽ hiểu rõ hơn.
    Em nghĩ mặc định địa chỉ của 1 integer là 1 int*, mặc định địa chỉ của 1 char là 1 char*,
    Mặc định của address là hexa decimal, thường thì người ta hay static_cast<long> cho dễ đọc, chứ không phải int*, và char*, đây là kiểu con trỏ không liên quan gì tới address cả mà em.

  8. #8
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Không phải do toán tử, toán teo gì đâu R_R ah. Yêu cầu các quý vị xem lại phần cộng địa chỉ con trỏ, con trỏ và tên định danh. Nó chỉ bó gọn trong vấn đề đó thôi. Nếu không hiểu cái này thì sức mạnh của C/C++ cũng không có thể sử dụng được nhiều đâu.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Không phải do toán tử, toán teo gì đâu R_R ah.
    Dr tin hay không thì tùy, thích thì DR tìm cuốn Locale and I/O stream on C++ Dr đọc sẽ hiểu.
    r2 nghĩ không rảnh để nói nghe cho vui đâu Dr, thứ 1 nếu Dr không hoặc biết không rõ thì ok, ai cũng có lúc nhầm, nhưng hình như r2 nói gì hình như r2 cũng check kĩ rùi chứ không phang bậy bạ như Dr nghĩ đâu. Dr nói mà hình như r2 thấy Dr không test cũng chẳng check, vấn đề này hồi đó r2 + sieuphuong + bác TQN + bete đã nói chắc cũng 40 bài nên hầu như có chết cũng phải nhớ đến nó. Nếu Dr nói không phải << thì Dr thử dùng printf Dr sẽ hiểu.

  10. #10
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Vấn đề cậu nói tớ hiểu, nhưng vấn đề ở đây là ...? Không phải đi bàn cout nó làm sao, hay nó thế nào mà vấn đề ở đây nó thuộc về tư duy của máy tính dựa vào cái thằng cout đó.

    Một chuỗi nó nằm trong bộ nhớ như thế nào? Bỏ qua vấn đề về in nó lên màn hình thế nào, hãy xét một ví dụ như sau:

    Nếu cho một chuỗi là char s[]="congdongcviet";
    Hãy cho biết: s+8 có phải là một chuỗi hay không? nếu phải, chuỗi s+8 là chuỗi nào?
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

Các đề tài tương tự

  1. Lập trình C Thay thế chuỗi s1 trong chuỗi s bằng chuỗi s
    Gửi bởi duytue trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 23-09-2011, 04:16 PM
  2. thay thế chuỗi con thứ i trong chuỗi mẹ bằng 1 chuỗi khác
    Gửi bởi nhat1811 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 06-08-2011, 08:25 AM
  3. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  4. Trả lời: 7
    Bài viết cuối: 21-03-2011, 09:59 PM
  5. xem một từ trong chuỗi là một chuỗi con, sắp xếp các chuỗi con theo thứ tự tăng dần
    Gửi bởi qpkdct1101 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 20-01-2011, 08:22 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn