Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Несколько вопросов по C++
Форумы портала PHP.SU » » Программирование на C++ » Несколько вопросов по C++

Страниц (2): [1] 2 »
 

1. snikers987 - 01 Февраля, 2012 - 22:29:04 - перейти к сообщению
CODE (text):
скопировать код в буфер обмена
  1.  
  2. #include <iostream.h>
  3. int main(){
  4.     char authpass[7] = "qwerty";
  5.     cout << "Hello, snikers987!\r\n";
  6.     cout << "This is your first programm on C++!\r\n";
  7.     char letter;
  8.     cout  <<  "Do you want begin? (y/n): ";
  9.     cin >> letter;
  10.     if(letter == 'y'){
  11.         char username[10];
  12.         cout << "Enter user name: ";
  13.         cin >> username;
  14.         cout << "User:" << username << "\r\n";
  15.         char pass[10];
  16.         cout << "Enter your password: ";
  17.         cin >> pass;
  18.         //cout << strlen(pass);
  19.        // if(strcmp(pass,authpass) > 0){
  20.         if(pass == authpass){
  21.             cout << "You have successfully authenticates!";
  22.         }else{
  23.             cout << "You have error!";
  24.         }
  25.     }else{
  26.         cout << "bay"<< endl;
  27.     }
  28. }
  29.  


Как вообще сравнить 2 строки?
strcmp() - компилятор говорит 'strcmp' was not declared in this scope
Если сравнивать строки == , то в любом случаи получаю You have error!
2. caballero - 01 Февраля, 2012 - 22:35:31 - перейти к сообщению
Цитата:
strcmp() - компилятор говорит 'strcmp' was not declared in this scope

инклуда соответствующего нет

Цитата:
Если сравнивать строки == , то в любом случаи получаю You have error!

в си так сравнивать нельзя

а вообще принятио использовать char* для строк вместо массивов
3. snikers987 - 01 Февраля, 2012 - 22:42:11 - перейти к сообщению
caballero пишет:
Цитата:
strcmp() - компилятор говорит 'strcmp' was not declared in this scope

инклуда соответствующего нет

Цитата:
Если сравнивать строки == , то в любом случаи получаю You have error!

в си так сравнивать нельзя

а вообще принятио использовать char* для строк вместо массивов


Ясно, а как определить что нужно инклудить?
char* variable; ?
4. OrmaJever - 01 Февраля, 2012 - 22:45:49 - перейти к сообщению
caballero пишет:
а вообще принятио использовать char* для строк вместо массивов

char* и char[] это одно и тоже Подмигивание
snikers987 пишет:
strcmp() - компилятор говорит 'strcmp' was not declared in this scope

string.h нужно подключить.
5. snikers987 - 01 Февраля, 2012 - 22:54:05 - перейти к сообщению
Только про char* не совсем понял, если так указать то получаю ошибку о том что память не может быть 'writen'..

А со сравнением строк вышло.

А скомпилированная версия работает не так как ожидалось. Растерялся
6. OrmaJever - 01 Февраля, 2012 - 22:58:38 - перейти к сообщению
snikers987 пишет:
если так указатьТак это как?

так это как?
7. snikers987 - 01 Февраля, 2012 - 23:00:07 - перейти к сообщению
OrmaJever пишет:
snikers987 пишет:
если так указатьТак это как?

так это как?


char* pass; ?
8. OrmaJever - 01 Февраля, 2012 - 23:03:38 - перейти к сообщению
snikers987 пишет:
char* pass; ?

Обьявлен указатель, но он не на что не указывает поэтому записывать некуда.
А когда обьвляешь char pass[10] то обьявляется масив размером 10 char'ов, в которые можно затем что-то записать.
(Добавление)
OrmaJever пишет:
char* и char[] это одно и тоже

этоя написал к тому что между
CODE (htmlphp):
скопировать код в буфер обмена
  1. char *str = "str";
  2. // или
  3. char str1[] = "str";

нету разницы.
9. snikers987 - 01 Февраля, 2012 - 23:14:00 - перейти к сообщению
Тоесть для того чтобы иметь возможность писать нужно при инициализации таки указывать
char pass[10]; , тоесть выделить память?
10. OrmaJever - 01 Февраля, 2012 - 23:17:11 - перейти к сообщению
да. Можно ещё динамически выделить память, но в даной ситуации это не нужно.
PHP:
скопировать код в буфер обмена
  1. char *str = new char[10];
  2. // делаем что-то сострокой.
  3.  
  4. //обязательно когда указательно больше не нужен, нужно освободить память.
  5. delete[] str;

(Добавление)
Си это не php, и чем раньше ты это поёмешь тем легче будет учить. Я когда начинал читать книги по Си я понял что на php может написать даже обезьяна (не хочу не кого обидеть). В Си нужно за всем следить, не хватит одного байта для записи и программа вылетит без обьяснений, забыл удалить указатель на динамически выделеную память, она закончится и программа тоже вылетит. Здесь нужно быть очень внимательным.
11. snikers987 - 01 Февраля, 2012 - 23:34:47 - перейти к сообщению
Ну то что Cи язык строгой типизации это я уяснил, но после php весьма сложно ко всему привыкнуть, наоборот было бы на много легче..
Буду читать, ну и тут спрашивать если что. Улыбка

А почему скомпилированная программа (из первого поста) весит почти 4 метра и требует еще несколько dll-ок?
И в qt программа работает, а после компиляции после ввода пароля просто вылетает?
12. OrmaJever - 01 Февраля, 2012 - 23:48:37 - перейти к сообщению
snikers987 пишет:
наоборот было бы на много легче..

наоборот учить было бы нечего, в php почти весь синтаксис взят из Си, да я даже больше скажу, он написан на Си.
snikers987 пишет:
А почему скомпилированная программа (из первого поста) весит почти 4 метра и требует еще несколько dll-ок?

Ну смотря какие либы она требует. Ну если там только один инклуд iostream то должна весить ~400 кб, а откуда 4мб я незнаю, может компилятор что-то своё добавил.
snikers987 пишет:
а после компиляции после ввода пароля просто вылетает?

Ну вот это про то что я говорил в преведущем посте.
1) пароль должен быть не больше 9 символов
2) Эту строку
CODE (htmlphp):
скопировать код в буфер обмена
  1. if(pass == authpass){

надеюсь заменил на
CODE (htmlphp):
скопировать код в буфер обмена
  1. if(!strcmp(pass, authpass)) {
13. snikers987 - 01 Февраля, 2012 - 23:56:50 - перейти к сообщению
OrmaJever пишет:
Эту строку

Конечно, заменил.

Более того, если в первом действии ввести ввести n (не y), происходит аналогичная ситуация..

CODE (text):
скопировать код в буфер обмена
  1.  
  2. #include <iostream.h>
  3. #include <string.h>
  4. int main(){
  5.     char* authpass = "qwerty";
  6.     //cout << authpass;
  7.     cout << "Hello, snikers987!\r\n";
  8.     cout << "This is your first programm on C++!\r\n";
  9.     char letter;
  10.     cout  <<  "Do you want begin? (y/n): ";
  11.     cin >> letter;
  12.     if(letter == 'y'){
  13.         char username[10];
  14.         cout << "Enter user name: ";
  15.         cin >> username;
  16.         cout << "User:" << username << "\r\n";
  17.         char *pass = new char[20];
  18.         cout << "Enter your password: ";
  19.         cin >> pass;
  20.        // cout << pass;
  21.         if(strcmp(pass, authpass) || strcmp(username, "snikers")){
  22.        // if(true){
  23.             cout << "You have error!";
  24.         }else{
  25.             cout << "You have successfully authenticates!";
  26.         }
  27.     }else{
  28.         cout << "bay";
  29.     }
  30. }
  31.  
  32.  
14. caballero - 02 Февраля, 2012 - 00:01:28 - перейти к сообщению
Цитата:
char* и char[] это одно и тоже


только содержимое можеть быть разным если не обнулить массив перед записью строки
15. OrmaJever - 02 Февраля, 2012 - 00:13:16 - перейти к сообщению
snikers987, могу предположиь что cin записывает и нулевой символ в конец строки (тоесть y и \0), а в один байт 2 символа не влезут. Вобщем нужно letter определить как
CODE (htmlphp):
скопировать код в буфер обмена
  1. char letter[2];
  2. //и сравнивать
  3. *letter == 'y'

 

Powered by ExBB FM 1.0 RC1