web-dev-qa-db-fra.com

Les programmes c ++ ne fonctionnent pas correctement

/* write a prog to take the name of the user and output it with a thank you stamement*/

#include<iostream>
using namespace std;
int main()
{
 char ch[20];
 cout<<"enter your name pls"<<endl;
  cin >> ch>>endl;
  cout<<"thank you::"<<ch<<endl;
 return 0;
}

La sortie est:

ff@ff-desktop:~/CCCP/ch1$ g++ 2.cpp -o 2
2.cpp: In function ‘int main()’:
2.cpp:9: error: no match for ‘operator>>’ in ‘std::operator>> [with _CharT = char, _Traits = std::char_traits<char>](((std::basic_istream<char, std::char_traits<char> >&)(& std::cin)), ((char&)(& ch))) >> std::endl’
/usr/include/c++/4.4/istream:119: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>& (*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:123: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:130: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:166: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:170: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:173: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:177: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:180: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:184: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:188: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:193: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:197: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:202: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:206: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:210: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:214: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:238: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/istream:741: note: std::basic_istream<_CharT2, _Traits2>& std::operator>>(std::basic_istream<_CharT2, _Traits2>&, _CharT2*) [with _CharT2 = char, _Traits2 = std::char_traits<char>, _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.4/bits/istream.tcc:853: note: std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT&) [with _CharT = char, _Traits = std::char_traits<char>]
ff@ff-desktop:~/CCCP/ch1$

Quelqu'un peut-il me dire ce qui ne va pas?

ACTIONPARSNIP (ANDREW-WOODHEAD666) a suggéré ceci:

Essayez de changer: #include <iostream>

À: #include "iostream"

Ou essayez: #include <iostream.h>

ou: #include "iostream.h"

Et après avoir fait ces changements, j'ai obtenu ce qui suit.

Voici la sortie du même programme ci-dessus, avec "iostream.h" au lieu de <iostream.h>:

2.cpp:2:21: error: iostream.h: No such file or directory
2.cpp: In function ‘int main()’:
2.cpp:8: error: ‘cout’ was not declared in this scope
2.cpp:8: error: ‘endl’ was not declared in this scope
2.cpp:9: error: ‘cin’ was not declared in this scope

Quelqu'un peut-il m'aider à ce sujet et me suggérer ce qui ne va pas?

1
faizan

#include <iostream> était correct. (En fait, vous aviez #include<iostream>, sans espace, mais c'est correct aussi.) Y compris "iostream.h" ou <iostream.h> à la place sont en fait tous les deux erronés, bien que certains compilateurs et bibliothèques standard les acceptent.

Ce problème est dû au fait que la bibliothèque standard ne fournit pas une surcharge de operator>> qui peut prendre un std::istream à gauche et un std::ostream& sur la droite. Pour le dire plus clairement, c'est là que votre erreur se produit:

cin >> ch>>endl;
  • Veuillez noter que cela équivaut à (cin >> ch) >> endl, et c'est le >> en dehors des parenthèses où l'erreur se produit, mais en changeant les parenthèses pour essayer de passer ch et endl comme arguments à >> serait également faux.
  • endl est un ostream& et cin est un istream. >> ne peut pas fonctionner avec un istream à gauche et un ostream& à droite, car la STL ne définit aucune surcharge pouvant être sélectionnée pour une telle expression.

Vous pouvez utiliser endl avec cout, mais vous ne pouvez pas l'utiliser comme ceci avec cin.

Comment résoudre ce problème dépend de ce que vous avez l'intention de faire.

  • Si votre objectif est d'imprimer une nouvelle ligne après avoir saisi les informations, ajoutez une instruction distincte (cout << endl) après cela, ou ajoutez endl à l'instruction suivante avec cout que vous avez déjà.

  • Si votre objectif est d'arrêter de saisir des données lorsqu'un saut de ligne est rencontré, cela se produira déjà en utilisant << avec cin, il suffit donc de supprimer complètement la partie endl:

    cin >> ch;
    
  • Si votre objectif est de continuer à prendre des entrées lorsque tout espace sauf une nouvelle ligne est rencontré (c'est-à-dire que vous voulez vous assurer de lire exactement une ligne d'entrée dans un tableau char orstd::string), vous devrez utiliser une expression plus complexe, ou peut-être même pas utiliser operator>> avec cin du tout.

    Puisqu'il n'est pas clair que c'est ce que vous voulez, et les solutions pour cela ne sont pas spécifiques à la plate-forme (alors que les surcharges disponibles dans une implémentation STL sont au moins théoriquement spécifique à la plate-forme), les détails sur la façon de procéder dépassent le cadre de cette réponse. Mais si c'est ce que vous voulez faire, je vous recommande de demander sur Stack Overflow .

4
Eliah Kagan