Chuỗi C ++ so với Mảng nhân vật


8

Tại sao bạn nghĩ rằng hầu hết các giảng viên C ++ giảng dạy khoa học máy tính cấp đại học không khuyến khích hoặc thậm chí cấm sử dụng chuỗi cho văn bản, thay vào đó yêu cầu sinh viên sử dụng mảng ký tự?

Tôi cho rằng phương pháp này bằng cách nào đó có ý định dạy thói quen lập trình tốt, nhưng theo kinh nghiệm của tôi, tôi không thấy có gì sai khi chỉ sử dụng chuỗi, và chúng dễ sử dụng và học hỏi hơn đáng kể.


9
Bạn có tham khảo cho tuyên bố rằng "hầu hết các giảng viên C ++ giảng dạy khoa học máy tính cấp đại học không khuyến khích hoặc thậm chí cấm sử dụng chuỗi cho văn bản, thay vào đó yêu cầu sinh viên sử dụng mảng ký tự?" Tôi không chắc đó là sự thật, nói chung. Nếu đúng như vậy, tôi nghi ngờ đó là vì lý do tương tự mà các giáo sư cấm hoặc không khuyến khích việc sử dụng bất kỳ thư viện nào: bởi vì sinh viên tìm hiểu thêm về các nguyên tắc cơ bản bằng cách tự mình làm mọi thứ?
Patrick87

Tôi biết các giáo sư tại Đại học bang Portland làm, và từ những gì tôi đã đọc trên một số diễn đàn về việc sử dụng mảng ký tự và chuỗi có vẻ như là đúng. Tôi có thể hoàn toàn sai, đó chỉ là những gì tôi đã tích lũy được trong kinh nghiệm (có giới hạn) của mình.
Taylor Huston

3
@TaylorHuston, có lẽ bạn nên hỏi những giáo sư đó.
Svick

4
Chào mừng bạn Đây là một câu hỏi didactics lập trình (không hoàn toàn CS), và nó hỏi ý kiến. Bình chọn để đóng như vậy. Nhân tiện, ở trường đại học của tôi họ không dạy C ++ chút nào. Các giáo sư làm có xu hướng tránh thực hành tốt nhất trong mã của họ, mặc dù. Tôi đoán đó là bởi vì họ là những nhà khoa học máy tính chứ không phải lập trình viên.
Raphael

3
@Raphael Inasmuch vì các khóa học này thường được giảng dạy bởi các nhà khoa học máy tính và thường là phần giới thiệu về lập trình và khoa học máy tính cùng một lúc, tôi nghĩ rằng câu hỏi này là chủ đề ở đây, và đây là một nơi thích hợp cho nó vì khán giả ( người trả lời tiềm năng) sẽ là nhà khoa học máy tính. Tôi nghi ngờ về tuyên bố này, nhưng các câu hỏi với các giả định sai là ok và nên được trả lời bằng một từ chối.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


7

Đối với một sinh viên CS, giáo sư có thể không khuyến khích std :: string và yêu cầu mảng char, để dạy những điều cơ bản về mảng. Ở trường tôi, giáo viên yêu cầu chúng tôi tự viết các thói quen C strlen, strcmpv.v. Nó không thể nhận được bất kỳ mức độ thấp nào sau đó (rời khỏi lắp ráp!).

Bằng cách sử dụng mảng, thay vì chuỗi, bạn có thể học quản lý bộ nhớ, hoạt động chuỗi, đáng chú ý là phân tích chuỗi. Bằng cách lặp qua mảng, về cơ bản, bạn đang phân tích chuỗi, tìm kiếm khoảng trắng, ký tự đặc biệt, mã thông báo, v.v.

Nhưng tôi không đề xuất mảng trên chuỗi, tất cả. Tôi chỉ đưa ra một lý do để đối phó với mảng, trong trường đại học.


7

Lập trình tăng tốc C ++lập trình của Stenstrup của Koenig và Moe : Nguyên tắc và thực hành sử dụng C ++ đang sử dụng std :: string và các thành phần khác từ thư viện chuẩn ngay từ đầu. Nếu tôi nhớ chính xác, họ thậm chí không trình bày mảng C cho Koenig và Moe và Stroustrup làm điều đó khá muộn trong cuốn sách (có lẽ chỉ trong một phụ lục).

Cách tiếp cận đó, đủ điều kiện là hiện đại , là phương pháp ưa thích trong vòng tròn của tôi. Cách tiếp cận khác, thường được coi là lịch sử , theo sát hơn cách C ++ phát triển, nhưng không tận dụng sự phát triển "mới hơn" (tương đối, hiện tại chúng đã 15 tuổi) và không dạy những gì được thực hiện bây giờ (ít nhất là trên các dự án không bị vướng bận với quá nhiều di sản) nhưng 10 năm trước (luôn có độ trễ trước khi trở thành chủ đạo).


4

Tôi không thể nói bất cứ điều gì về "hầu hết" so với "một số" giảng viên lập trình, nhưng tôi có thể nói rằng trong chương trình giảng dạy CS, các khóa học lập trình sớm có hai mục tiêu:

  • Chuẩn bị cho sinh viên các chủ đề kiểu kỹ thuật phần mềm
  • Cho học sinh làm quen với các hoạt động cơ bản của máy tính là gì và cách triển khai các khái niệm cấp cao hơn như chuỗi hành xử khác nhau

Đôi khi có đôi chút mâu thuẫn, và các giáo viên khác nhau sẽ tạo ra sự đánh đổi khác nhau.


2
Bạn quên ít nhất một mục tiêu thứ ba: dạy các điều kiện tiên quyết cho các khóa học khác và thực tập bắt buộc.
AProgrammer

1
Nếu khóa học là thuật toán, cách tiếp cận cấp thấp là tốt hơn. Nếu khóa học là lấy thông tin, cách tiếp cận cấp cao là tốt hơn. Các khóa học khác nhau muốn những thứ khác nhau.
Louis

4

Tôi đoán nó phụ thuộc vào những gì bạn đang cố dạy trong khóa học đó ... "Khoa học máy tính" là một định nghĩa hơi mơ hồ.

Nếu khóa học về Thuật toán và Cấu trúc dữ liệu, thì việc dạy sinh viên về std::stringhoàn toàn không có giá trị giáo huấn. charTuy nhiên, sử dụng mảng như một giới thiệu về mảng và hoạt động trên đó là khá hợp pháp.

Nếu khóa học là về thiết kế đối tượng, thì tôi đoán std::stringcó một số giá trị như một ví dụ về kiểu dữ liệu trừu tượng.

Nếu khóa học chỉ là về thực hành tốt nhất trong C ++, thì tôi sẽ lo lắng về loại trường đại học của bạn và cách họ thiết kế chương trình giảng dạy Khoa học máy tính của họ.


2

Tôi đoán bạn đã hiểu sai mục tiêu thực tế của khóa học của mình, vì C ++ tốt (về cơ bản) sử dụng các tóm tắt được cung cấp bởi thư viện chuẩn (tại sao bạn muốn phát minh lại bánh xe?).

Thậm chí còn có một câu trích dẫn của Stroustrup nói rằng "giữ các mảng khỏi giao diện" trong Câu hỏi thường gặp của anh ấy, nơi anh ấy đưa ra một số gợi ý về cách viết mã an toàn. Do đó, tôi nghi ngờ rằng bạn thực sự được khuyên là không sử dụng chúng, vì chúng rất tệ, nhưng để tìm hiểu một số nguyên tắc cơ bản về cách mọi thứ hoạt động, vì vậy sau này bạn có thể sử dụng sự hiểu biết đó nếu bạn thực sự cần phải tối ưu hóa hoặc làm việc khác, mà bạn cần những điều cơ bản thực sự.


0

Trong một số trường hợp, chuỗi tốt là khác, chúng không giống với char

/ ** Ví dụ sử dụng 1 chuỗi trong trường hợp này bị cắt bởi Spaces ở đầu ra nếu chúng ta viết del test.txt, đầu ra sẽ là Line 1 del Line 2 test.txt không tốt ** /

#include <iostream>
#include <stdlib.h>
using namespace std ; 

string get_input ;

int main()
{
main:
    cin >> get_input ;
    system(get_input.c_str()) ;
    goto main ;
}

/ ** Ví dụ 2 chương trình giống nhau nhưng chúng tôi chuyển đầu vào trong một char với trường 80 đầu ra cho cùng một cmd vì ví dụ đầu tiên sẽ là del test.txt trên cùng một dòng tốt ** /

#include <iostream>
#include <stdlib.h>
using namespace std ; 

char input[80] ;
string get_input ;

int main()
{
main:
    cin.getline(input ,80) ;
    get_input = input ;
    system(get_input.c_str()) ;
    goto main ;
}

Chuỗi là các đối tượng đại diện cho chuỗi các ký tự.

Lớp chuỗi tiêu chuẩn cung cấp hỗ trợ cho các đối tượng như vậy với giao diện tương tự như lớp chứa byte tiêu chuẩn, nhưng thêm các tính năng được thiết kế đặc biệt để hoạt động với chuỗi các ký tự byte đơn.

Lớp chuỗi là một khởi tạo của mẫu lớp basic_ chuỗi sử dụng char (tức là byte) làm kiểu ký tự của nó, với các kiểu char_traits và cấp phát mặc định của nó (xem basic_ chuỗi để biết thêm thông tin về mẫu).

Lưu ý rằng lớp này xử lý byte độc ​​lập với mã hóa được sử dụng: Nếu được sử dụng để xử lý chuỗi các ký tự nhiều byte hoặc độ dài thay đổi (như UTF-8), tất cả các thành viên của lớp này (chẳng hạn như chiều dài hoặc kích thước), cũng như các trình vòng lặp của nó, vẫn sẽ hoạt động dưới dạng byte (không phải ký tự được mã hóa thực tế). -C ++ Tham khảo http://www.cplusplus.com/reference/opes/opes/ [1]:

tôi đề nghị xem xét:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.