Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 26 kết quả

Đề tài: setw trên C++ có ý nghĩa và công dụng như thế nào?

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

    Arrow setw trên C++ có ý nghĩa và công dụng như thế nào?

    Theo em nghĩ thì:
    1) cout << setw(3) nghĩa là dành 3 chỗ để in ra, nếu chuỗi cần in ngắn hơn 3 thì dư 1 chỗ ở đầu.
    2) cin >> setw(3) nghĩa là dành 3 chỗ để đưa 3 ký tự vào, nếu chuỗi nhập ngắn hơn 3 thì chỗ dư bị bỏ đi.
    Nhưng khi em gõ 123 vào thì chương trình lại in ra 12 mà không phải là 123.
    Có thể giải thích cho em bên trong máy, setw dành chỗ cho ký tự như thế nào ko?
    Em cám ơn nhiều ^ ^.

    Code:
    #include <iostream>
    using std::cout;
    using std::cin;
    using std::endl;
    #include <iomanip>
    using std::setw;
    #include <string>
    using std::string;
    
    void main()
    {
    	string s;
    	cin >> setw(3) >> s;	
    	cout << s << endl;
    }
    Đã được chỉnh sửa lần cuối bởi Emerald214 : 08-04-2008 lúc 10:10 PM.
    "what you don't use you don't pay for" (Bjarne Stroustrup).

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

    Oa , setw dùng được cho cả cin nữa hả , trước giờ mình cứ nghĩ nó chỉ dùng cho cout thui chứ . Mình test thử thấy đúng là setw(3) thì nếu nhập 1234 thì nó chỉ in ra 12 thui .

    Mình đoán là do bạn nhập theo kiểu chuỗi nên nó bắt buộc phải dành 1 chỗ cho ký tự kết thúc chuỗi ( NULL : mã ASCII là 0 ) nên mới có hiện tượng như vậy .

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

    uhm! Đúng roài. Vì bạn khai báo là string nên nó là kiểu chuõi. Mà kiểu chuỗi thì lúc nào cũng có kí tự kết thúc là '/0' nên mới thiếu đi 1 số

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

    Hi, bác Deitel viết sách sai rồi ^ ^, copy y chang, chương trình chạy sai(trang 577, figure 11.4, "How to program C++ 5th"). Chắc phải gọi điện cho bác ấy chỉnh lại quá ^ ^.

    Chắc không phải vậy đâu, vì khi em ghi:
    cin >> s; // type 12
    cout << setw(3) thì nó ra là " 12"(có space ở đầu), nếu nói như anh chị thì nó phải chừa ra 1 chỗ cho NULL thì phải in là "12"(không có space) chứ? ^ ^
    Đã được chỉnh sửa lần cuối bởi Emerald214 : 08-04-2008 lúc 10:35 PM.
    "what you don't use you don't pay for" (Bjarne Stroustrup).

  5. #5
    Ngày gia nhập
    11 2006
    Bài viết
    633

    cout <<setw(3) thì chuỗi được căn phải do đó nó mới có dạng là " 12" chứ ko phải là do có null hay ko có null.
    Giải thích theo thanhvinh là đúng rồi.

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

    Mặc định setw trên C++ có ý nghĩa và công dụng như thế nào?

    2) cin >> setw(3) nghĩa là dành 3 chỗ để đưa 3 ký tự vào, nếu chuỗi nhập ngắn hơn 3 thì chỗ dư bị bỏ đi.
    Nhưng khi em gõ 123 vào thì chương trình lại in ra 12 mà không phải là 123.
    Có thể giải thích cho em bên trong máy, setw dành chỗ cho ký tự như thế nào ko?
    Em cám ơn nhiều ^ ^.
    Cậu thử với compiler nào vậy, tui ra 123 đây !
    Hi, bác Deitel viết sách sai rồi ^ ^, copy y chang, chương trình chạy sai(trang 577, figure 11.4, "How to program C++ 5th"). Chắc phải gọi điện cho bác ấy chỉnh lại quá ^ ^.
    Deitel là nhà Xuất bản. Edition của cậu là version mấy, hoặc post đoạn code đó lên thử xem.
    Hầu hết cả kiểu trên đều right justified, muốn canh trái thì std::left.
    C++ Code:
    1. #include <iostream>
    2. using std::cout;
    3. using std::cin;
    4. using std::endl;
    5. #include <iomanip>
    6. using std::setw;
    7. #include <string>
    8. using std::string;
    9.  
    10. int main()
    11. {
    12.   string s;
    13.   int n;
    14.   char c;
    15.     cout << "string : ";
    16.     cin >> s;
    17.     cout << "int : ";
    18.     cin >> n;
    19.   cout << "char : ";
    20.   cin >> c;
    21.  
    22.   cout << setw(8) << s << endl;
    23.   cout << setw(8) << n << endl;
    24.   cout << setw(8) << c << endl;
    25. }
    Test thử cái này xem sao !

    uhm! Đúng roài. Vì bạn khai báo là string nên nó là kiểu chuõi. Mà kiểu chuỗi thì lúc nào cũng có kí tự kết thúc là '/0' nên mới thiếu đi 1 số
    std::string khác rất xa const char*, cout khác rất xa printf.
    Nếu cậu khai báo :
    C++ Code:
    1. int main()
    2. {
    3.   char s[5];
    4.   cin >> setw(5) >> s;
    5.   cout << s;
    6. }
    Nó sẽ đọc 4 kí tự và chừa cho 1 cho '\0'
    Còn C++ không có chuyện đó :
    C++ Code:
    1. int main()
    2. {
    3.   string s;
    4.   cin >> s;
    5.   cout << setw(5) << s;
    6. }
    Tui nhập vào abcde, ra abcde
    Và setw() nó chỉ hoạt động đúng khi nào stream input nhỏ hơn range (setw(range))
    Ví dụ nếu cậu dùng :
    C++ Code:
    1. int value = 18397;
    2. cout << setw(2) << value;
    cout sẽ override setw() và in ra toàn bộ số đó. Nhưng đối với string C++ thì lại khác :
    C++ Code:
    1. int main()
    2. {
    3.   string s;
    4.   cin >> setw(5) >> s;
    5.   cout << s;
    6. }
    Cậu nhập dư quá 5 ví dụ 10 kí tự xem, nó cắt ngay và không hề có chừa chỗ cho NULL , quá đỉnh phải không . Vì string C++ nó định nghĩa lại rất make sense với suy nghĩ của người dùng. Đó là vì sao C++ string luôn luôn được sử dụng hơn là string C hồi xưa.

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

    1) Thanks, em hiểu rồi, vì vậy “thống nhất dùng string”(tại nó xịn^^) nhưng… không biết khi kiểm tra có cho xài ko ^ ^.

    2) Mấy cái ở trên đúng hết nhưng cái cuối em nhập 1234567890 thì nó in 1234 (chắc lại dành 1 cho NULL nữa quá >.<).
    Code:
    int main()
    {
      string s;
      cin >> setw(5) >> s;
      cout << s;
    }
    3) Còn đây là ý kiến của em. Compiler của em là VC++ 6.0.
    Em đã viết ra 1 ví dụ mới, test thử từng cái thì kết luận rằng:
    3.1) Khi cout + setw thì:
    + Nếu chuỗi nhập lớn hơn range: Nó sẽ cout hết những gì ta nhập bất chấp capacity của mảng string hay char[] đó là bao nhiêu.
    + Nếu chuỗi nhập nhỏ hơn range: setw sẽ có tác dụng ^ ^.
    3.2) Khi cin + setw thì:
    + Nếu chuỗi nhập lớn hơn range: Nó sẽ cin vào (range – 1) ký tự.
    + Nếu chuỗi nhập nhỏ hơn range: thì... bình thường thôi ^ ^.
    Code:
    const int A = 3;
    void main()
    {
    	char s1[A] = {0};
    	string s2;
    
    	cin >> setw(A) >> s1;
    	cout << "Array: " << s1 << endl;
    	
    	//2//cin >> setw(A) >> s2;	
    	////cout << "String: " << s2 << endl;
    	
    	//3//cin >> s1;
    	////cout << "Array: " << setw(A) << s1 << endl;
    	
    	//4//cin >> s2;	
    	////cout << "String: " << setw(A) << s2 << endl;
    	
    }
    Đã được chỉnh sửa lần cuối bởi Emerald214 : 09-04-2008 lúc 10:43 PM.
    "what you don't use you don't pay for" (Bjarne Stroustrup).

  8. #8
    Ngày gia nhập
    11 2006
    Bài viết
    633

    C++ mà ko cho xài string là 1 sự ngu dốt có hệ thống.

  9. #9
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    Hơi ngoài đề một chút: Vậy khi nào thì không nên xài string

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

    Hơi ngoài đề một chút: Vậy khi nào thì không nên xài string
    Cái này thì em cũng không rõ lắm, nhưng em đọc thì có 1 số trường hợp có thể xài vector<char> thay thế cho string, nhưng chắc chắn pure char[] là không nên dùng. Nếu cho em xài từ trên xuống dưới theo độ ưu ái .
    - string : 1st
    - vector<char> : 2nd
    - char [] : 3rd

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

  1. Cách sử dụng cin.getline và setw() trong C++ như thế nào??
    Gửi bởi conghanh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 03-09-2012, 04:35 PM
  2. thư viện của lệnh setw() trong Dev-C++
    Gửi bởi meoluoi_nd 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: 04-08-2012, 02:28 PM
  3. setw(n) có hỗ trợ trong vc++ 2008 ko?
    Gửi bởi judoka trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 09-06-2012, 08:21 AM
  4. Kỹ thuật C++ Canh trái cho lệnh setw()
    Gửi bởi cab8nwf6hgpc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 10-06-2010, 05:23 PM

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