2010-09-16 64 views

Trả lời

16

cin không phải là một tuyên bố, đó là biến đề cập đến luồng đầu vào chuẩn. Vì vậy, trận đấu gần nhất trong C thực sự là stdin.

Nếu bạn có một C++ tuyên bố như:

std::string strvar; 
std::cin >> strvar; 

một điều tương tự trong C sẽ là sử dụng bất kỳ một loạt các chức năng đầu vào:

char strvar[100]; 
fgets (strvar, 100, stdin); 

Xem an earlier answer Tôi đã đưa ra một câu hỏi ngày hôm nay trên một cách để làm đầu vào dòng và phân tích cú pháp một cách an toàn. Về cơ bản, nó nhập một dòng với fgets (tận dụng khả năng bảo vệ tràn bộ đệm của nó) và sau đó sử dụng sscanf để quét đường an toàn.

Những điều như gets()biến thể nhất định của scanf() (như chuỗi vô biên) nên tránh như tránh tà vì chúng dễ dàng nhạy cảm để đệm quá chạy. Chúng rất tốt để chơi với nó nhưng bạn càng sớm tìm hiểu cách tránh chúng, mã của bạn càng mạnh mẽ hơn.

+4

Tôi nghĩ sẽ công bằng khi diễn giải câu hỏi có nghĩa là 'tương đương với một tuyên bố sử dụng cin' – sje397

9

Bạn có thể muốn scanf.

Một ví dụ từ liên kết: Tuy nhiên

int i, n; float x; char name[50]; 
n = scanf("%d%f%s", &i, &x, name); 

Note (như đã đề cập trong ý kiến) scanf đó là dễ bị buffer overrun, và có rất nhiều các chức năng nhập khác mà bạn có thể sử dụng (xem stdio.h).

+2

Nếu bạn _must_ sử dụng 'scanf', ít nhất hãy sử dụng nó theo cách không tràn bộ đệm :-) Xem http://stackoverflow.com/questions/3723044/get-scanf-to-quit-when -it-đọc-a-newline/3723071 # 3723071 cho một cách tốt hơn. – paxdiablo

+1

Vui lòng không khuyên bạn sử dụng 'scanf'. http://c-faq.com/stdio/scanfprobs.html – jamesdlin

+3

Tôi nghĩ rằng cảnh báo của tôi đủ rõ ràng.OP rõ ràng là khá mới đối với C, và scanf cung cấp sự khởi đầu hoàn hảo để tìm hiểu về đầu vào dòng lệnh mà không cần phải quan tâm đến các phức tạp bổ sung. Tôi chắc chắn rằng anh/cô ấy sẽ gặp phải ý tưởng của bộ đệm tràn ngập một lần nữa trước khi bất kỳ mã sản xuất được viết. Nhiều người dùng có kinh nghiệm đọc câu hỏi nên chú ý đến cảnh báo. – sje397

1

Trong C++, cin là luồng đầu vào chuẩn. Không có luồng đầu vào nào trong C, nhưng có một đối tượng tệp, được gọi là stdin. Bạn có thể đọc từ nó sử dụng rất nhiều cách khác nhau, nhưng đây là một ví dụ từ cplusplus.com:

/* fgets example */ 
#include <stdio.h> 

int main() 
{ 
    char buffer[256]; 
    printf ("Insert your full address: "); 
    if (fgets(buffer, 256, stdin) != NULL) { 
    printf ("Your address is: %s\n", buffer); 
    } 
    else { 
    printf ("Error reading from stdin!\n"); 
    } 
    return 0; 
} 

CẬP NHẬT

Tôi đã thay đổi nó để sử dụng fgets, đó là đơn giản hơn nhiều kể từ khi bạn có lo lắng về dung lượng bộ đệm của bạn. Nếu bạn cũng muốn phân tích cú pháp scanf sử dụng đầu vào, nhưng hãy đảm bảo rằng bạn sử dụng thuộc tính chiều rộng.

+2

-1 cho ngay cả * đề cập * 'được'. Nó quá dễ bị tràn bộ đệm, và không bao giờ nên, bao giờ, * bao giờ * được sử dụng trong mã mới. – cHao

+0

Được rồi, tôi sẽ sửa chữa. Bạn có nghĩ scanf tốt hơn không? : P –

+1

Cá nhân tôi không phải là người hâm mộ của nó. 'fgets' thực hiện một công việc tương tự với' gets', và cho phép bạn chỉ định chiều dài bộ đệm. Việc bắt duy nhất là iirc nó giữ dòng mới chứ không phải là chomping nó. – cHao

2

Không có tương đương gần cin trong C. C++ là một ngôn ngữ hướng đối tượng và cin sử dụng nhiều tính năng của nó (đối tượng định hướng, các mẫu, điều hành quá tải) mà không có sẵn trên C.

Tuy nhiên, bạn có thể đọc mọi thứ trong C bằng cách sử dụng thư viện chuẩn C, bạn có thể xem phần liên quan tại đây (cstdio reference).

+1

+1 để cung cấp tham chiếu được liên kết thay vì đề cập/minh họa một hàm đơn như thể đó là tùy chọn C duy nhất. @Anteater: là tiêu đề để sử dụng các quy trình I/O kiểu C trong các chương trình C++, nếu bạn đang viết một chương trình C chỉ #include

+0

Bạn nói đúng, tôi rất quen với C++ đã quên rằng trong C tên tiêu đề khác nhau. – jbernadas

Các vấn đề liên quan