[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. masterlights

    masterlights New Member

    Joined:
    20 Oct 2011
    Messages:
    41
    Likes Received:
    0
    Reputations:
    0
    Вот код программы на Си

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
       int c;
       int nl=0;
    
        while ((с = getchar()) != EOF)
            if (c == '\n')
                ++nl;
        printf("%d\n", nl);
    
    
    	system("pause");
    }
    пишет ошибку

    Ошибка 1 error C2065: с: необъявленный идентификатор

    Ошибка 2 IntelliSense: идентификатор "с" не определен

    в чём ошибка?
     
  2. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    c должен иметь тип char а не int.
     
  3. Xnamed

    Xnamed New Member

    Joined:
    1 Feb 2009
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    c другой раскладкой написал))))) омг))

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
       int c;
       int nl=0;
       while (c = getchar()!= EOF)
            if (c == '\n')
                ++nl;
        printf("%d\n", nl);
    	system("pause");
    }
    работает?
     
    #6803 Xnamed, 31 Oct 2011
    Last edited: 31 Oct 2011
  4. masterlights

    masterlights New Member

    Joined:
    20 Oct 2011
    Messages:
    41
    Likes Received:
    0
    Reputations:
    0
    хахахаха ну я б*я дурак :D
    щас сам проверил всё норм баротает хахах
    спасибо))
    а то долго бы я ещё парился)))
     
  5. masterlights

    masterlights New Member

    Joined:
    20 Oct 2011
    Messages:
    41
    Likes Received:
    0
    Reputations:
    0
    Вот ещё программа (из примера книжки)

    Code:
    #include <stdio.h>
    
    /* подсчет вводимых символов; 1-я версия */ 
    main()
    {
        long nc;
        nc = 0;
    
        while (getchar() != EOF)
            ++nc;
        printf(“%ld\n”, nc);
    }
    
    ввожу в консоли символы и она нечего не считает(не выводит nl), в чём может быть проблема?
     
  6. swt1

    swt1 Elder - Старейшина

    Joined:
    16 Feb 2008
    Messages:
    306
    Likes Received:
    78
    Reputations:
    21
    #include <iostream>
    using namespace std;
    main()
    {
    long nc;
    nc = 0;
    while (getchar()!= '\n')
    ++nc;
    cout<<nc<<endl;
    }
     
  7. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Доброго времени суток! На этот раз обращаюсь с такой проблемой: не пересылается все сообщение. Присылается только первый символ вне зависимости от размера буфера. Клиент написан на с использованием mfc а сервер - winapi.
    исходники лежат тут: исходник
    подскажите пожалуйста в чем проблема, потому что сам не разберусь(
     
    #6807 maked0n, 1 Nov 2011
    Last edited: 1 Nov 2011
  8. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    Code:
    ...
    recv(clientSocket, buff, 20, 0);
    ...
    
    В этом месте явная неточность. Функция вызывается один раз, и она совершенно не обязательно прочитает все (т.к возможны сбои в передаче и т д). Правильно было бы сделать так:
    Code:
    char answer[256] = "";
    while(recv(clientSocket, buff, 19, 0))
       strcat(answer,buff);
    
     
    #6808 awdrg, 1 Nov 2011
    Last edited: 1 Nov 2011
  9. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Ты знаешь, что такое переполнение буфера? Ты знаешь, что в случае ошибки recv может вернуть -1? Ты знаешь, что recv может считывать не только текстовые, но и бинарные данные, поэтому не стоит полагаться на strcat?
     
  10. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    ну переполнения буфера там нет ибо посылаю я только 5-6 символов, да и на клиенте проверка стоит. а вот на счет бинарных данных не совсем понял - я же посылаю только текстовые.
     
  11. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Это были вопросы к awdrg. И тем не менее, если приложение где-то в сети вертеться будет, не стоит полагаться на то, что "мне будут присылать всегда только текст". Сам исходник не смотрел, не переношу MFC)


    Хотя есть подозрение, что пересылается-то всё, просто ты выводишь юникодную строку с помощью std::cout. Надо бы использовать std::wcout.
     
    #6811 GRRRL Power, 1 Nov 2011
    Last edited: 1 Nov 2011
  12. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    Скажем так, мой вариант более рабочий чем самый первый, это все что нужно автору вопроса. Захочет узнать глубже - почитает.
     
  13. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    ага, попробую, спасибо. а вот еще вопрос: у меня дома роутер, и если я сокеты пытаюсь подключить используя внешний ип то SOCKET_ERROR при connect(). если же использую 127.0.0.1 или локальный у меня в сети то все ок. вопрос: как избавиться от проблемы? я так понимаю, что всему виной роутер, или нет?

    ЗЫ: тов. awdrg, не работает Ваш исходник(
    ЗЫЫ: кстати, массив похоже пересылается либо весь, либо отчасти весь, ибо когда после посылки строки close я делаю:
    if(strcmp(buff, "c") == 0)
    break;
    то проверка не проходит => в массиве все-таки содержится не просто c, а что-то еще.
     
    #6813 maked0n, 1 Nov 2011
    Last edited: 1 Nov 2011
  14. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Научись дебажить программы, в Visual Studio же пишешь. Ставишь брейкпоинт на recv, выполняешь шаг, смотришь, что в буфере лежит, смотришь, что вернула recv (сколько байт принято, то бишь). Простейшая же задача, а решить не можешь. Тем более, отсылаешь Unicode, а в сервере используешь функции для работы с ANSI. Естественно, код товарища awdrg для юникода не будет работать.
     
  15. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    спасибо за совет, выяснил что массив у меня присылается таким образом(предположим я отправил строку text):
    [0] = "t"
    [1] = 0
    [2] = "e"
    [3] = 0
    [4] = "x"
    [5] = 0
    [6] = "t"
    в результате чего такое вот происходит?
     
  16. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Я уже в третий раз пишу, что это UNICODE. Открывай гугл или википедию, и читай, в чем отличие Unicode от ANSI. Сразу поймешь.
     
  17. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    195
    Likes Received:
    31
    Reputations:
    1
    кодировка Unicode, 2 байта на 1 символ
     
  18. herfleisch

    herfleisch Elder - Старейшина

    Joined:
    7 Jan 2009
    Messages:
    579
    Likes Received:
    203
    Reputations:
    13
    А ещё лучше бы не просто узнать что такое Unicode, но и что такое WideChar-строки и UTF8-строки. В этих вещах нужно плавать как рыба в воде.
     
  19. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Доброго времени суток еще раз! Суть проблемы вот в чем: мне необходимо из реестра вытащить имя процессора. Вот мой код:
    Code:
    	HKEY hKey;
    	res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey);
    	if(res != ERROR_SUCCESS)
    		cout << "RegOpenKeyEx() failed with code " << res << endl;
    	res2 = RegQueryValue(hKey, "ProcessorNameString", proc, (long*)1024);
    	if(res2 != ERROR_SUCCESS)
    		cout << "RegQueryValue() failed with code " << res2 << endl;
    
    так вот при таком раскладе оно пишет мне
    RegQueryValue() failed with code 2.
    однако я точно знаю что поле ProcessorNameString у меня есть. пробовал дебагить и обнаружил одну странную вещь(хотя может так и должно быть :confused: ): когда навожу курсор на hKey в ф-ции RegQueryValue, оно мне показывает что
    CXX0030: Error: expression cannot be evaluated.
    я так подозреваю что тут что-то не так. что же я не правильно сделал?
    ЗЫ: в гугле я искал, везде пишут что с указателями проблема при такой ошибке: там память не выделил, там еще что-то. но тут вроде такого нет. :confused: :confused:
     
  20. ITdocer

    ITdocer New Member

    Joined:
    23 Aug 2011
    Messages:
    80
    Likes Received:
    0
    Reputations:
    -5
    а как сделать программу что по нажатие клавиши он она будет шифровать текст по определенному алгоритму???(ввод в Memo)
    это консольная прога,как перебазировать этот скрипт в форму билдера?

    #include <stdio.h>
    #include <conio.h>
    #include <condefs.h>

    int main() {
    char str[]="любой текст";
    int i=0;
    while (str!='\0') {
    printf("%c", str[i++]^100);
    if (str=='\0') break;
    printf("%c", str[i++]|10);
    if (str=='\0') break;
    printf("%c", str[i++]&400);
    if (str=='\0') break;
    }
    printf("\n");
    getch();
    return 0;
    }
     
    #6820 ITdocer, 3 Nov 2011
    Last edited: 3 Nov 2011
Thread Status:
Not open for further replies.