2010-09-16 16 views

Odpowiedz

16

cin nie jest instrukcją, jest zmienną, która odnosi się do standardowego strumienia wejściowego. Więc najbliższy mecz w C jest w rzeczywistości stdin.

Jeśli masz C++ stwierdzenie jak:

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

coś podobnego w C byłoby użycie dowolnego z szerokiej gamy funkcji wejściowych:

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

Zobacz an earlier answer Zadałem dziś pytanie w jeden sposób, aby wprowadzić dane wejściowe i bezpiecznie analizować. Zasadniczo wprowadza linię z fgets (korzystając z jej zabezpieczenia przed przepełnieniem bufora), a następnie za pomocą sscanf, aby bezpiecznie skanować linię.

Rzeczy takie jak gets() i pewnych odmianach z scanf() (jak nieograniczonych strun) należy unikać jak ognia, ponieważ są one łatwo podatne na nadmierne bufor tras. Są odpowiednie do zabawy, ale im szybciej się ich nauczysz, tym mocniejszy będzie twój kod.

+4

Myślę, że byłoby sprawiedliwe, aby interpretować pytanie jako "ekwiwalent zaświadczenia przy użyciu cin" – sje397

9

Prawdopodobnie chcesz scanf.

Przykładem z linku:

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

Uwaga jednak (jak wspomniano w komentarzach), która jest podatna na scanf buffer overrun, i istnieje wiele innych funkcji wejściowych można użyć (patrz stdio.h).

+2

Jeśli używasz 'scanf', używaj go przynajmniej w sposób nie przepełniający bufora :-) Zobacz http://stackoverflow.com/questions/3723044/get-scanf-to-quit-when -it-reads-a-newline/3723071 # 3723071 dla lepszego sposobu. – paxdiablo

+1

Nie polecaj używania 'scanf'. http://c-faq.com/stdio/scanfprobs.html – jamesdlin

+3

Myślę, że moje ostrzeżenie jest wystarczająco jasne.OP jest oczywiście całkiem nowy w C, a scanf zapewnia doskonały początek nauki wprowadzania danych z linii poleceń bez konieczności zajmowania się dodatkowymi złożonościami. Jestem pewien, że spotka się z pomysłem przepełnienia bufora zanim zostanie napisany kod produkcyjny. Bardziej doświadczeni użytkownicy czytający pytanie powinni uważać na ostrzeżenie. – sje397

1

W języku C++, cin jest strumieniem wejściowym stdin. W C nie ma strumienia wejściowego, ale istnieje obiekt pliku o nazwie stdin. można odczytać z niego przy użyciu wielu sposobów, ale tutaj jest przykład z 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; 
} 

UPDATE

Zmieniłem go używać fgets, co jest znacznie prostsze, ponieważ masz martwić się, jak duży jest twój bufor. Jeśli chcesz przeanalizować dane wejściowe, użyj polecenia scanf, ale upewnij się, że używasz atrybutu width.

+2

-1 dla parzystego * wymieniania * 'dostaje'. Jest zbyt podatny na przepełnienie bufora i nigdy, nigdy, * nigdy * nie powinien być użyty w nowym kodzie. – cHao

+0

Dobra, naprawię to. Czy uważasz, że scanf jest znacznie lepszy? : P –

+1

Ja osobiście nie jestem tym fanem. 'fgets' wykonuje podobne zadanie jak' gets' i pozwala ci określić długość bufora. Jedyny haczyk polega na tym, że iirc trzyma nowy znak, a nie je uderza. – cHao

2

Nie ma blisko równoważne cin w C. C++ jest językiem obiektowym i cin używa wielu jego funkcji (Object-orientacja, szablony, przeciążanie operatorów), które nie są dostępne w C

jednak możesz czytać rzeczy w C używając standardowej biblioteki C, możesz spojrzeć na odpowiednią część tutaj (cstdio reference).

+1

+1 dla zapewnienia odniesienia połączonego zamiast wymieniania/ilustrowania pojedynczej funkcji, tak jakby była to jedyna opcja C. @Anteater: jest nagłówkiem używanym w procedurach C/I w programach C++, jeśli piszesz program w języku C tylko #include

+0

Masz rację, jestem tak przyzwyczajony do C++, że zapomniałem, że w C nazwy nagłówków są różne. – jbernadas