[ 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. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    ss88,Не люблю копаться в чужих кодах.... Давай на словах. Имеется в виду, что надо сосканировать предложение, разбить на слова и... а дальше чо? "Заностится в бинарно дерево" по какому принципу? Если просто слова по-порядку, то просто забить слова в структуру (массив), а дальше их печатать в виде дерева (всмысле в каждой строке увеличиваем колличество распечатываемых слов в 2 раза). В этом коде слишком муторно разбираться...
     
  2. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    PHP:
    char newInt = new char[20];
    newInt "sdfdsfsdfdsf";
        
    cout << newInt << endl;

    for(
    int i=0i  300i++, newInt++)
    cout << *newInt;
    учу С++ по книжке, есть вопрос.
    первый цаут выводит полную строку, а второй -
    и после самой строки там непечатных символа, которые никак не копируются.

    Скажите, куда эт я залез и если изменить эту информацию по указателю - могу ли я испортить работу другой программы или подвесить свою?

    Свободная память для каждой программы своя?
     
  3. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    У каждого процесса свое виртуальное адрессное пространство, читаем про виртуальный режим.

    У тебя строка sdfdsfsdfdsf длинной 12 символов, а ты выводишь данные за указателем тк i < 300 (а именно все то что лежит за этой строкой)

    Так же у тебя будет тут утечка памяти вот тут
    Так как ты указателю который указывает на выделенную в куче память присваиваешь адрес строки которая лежит в локальном стеке ф-ции, то теряется выделенный блок памяти, правильно сделать так:
    Code:
    strcpy(newInt, "sdfdsfsdfdsf");
    тогда наша строка будет лежать в куче.
    Также не забываем вызывать delete/delete[] после того как выделенная память не нужна.
     
    #2743 razb, 25 Apr 2009
    Last edited: 25 Apr 2009
  4. Mosvit

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

    Joined:
    5 Mar 2007
    Messages:
    86
    Likes Received:
    16
    Reputations:
    1
    Помогите составить программу на Си, которая бы открывала текстовый файл с набором русских английских симовлов и цифр и выводила всё кроме 0-9 A-Z и a-z

    Я попытался сделать вот так (программа выводящая все символы кроме 0 и 1), но что-то не работает :(((

    Code:
    #include <stdio.h>
    #include <string.h>
    #define file "C:\\aq.txt"
    
    main()
    {FILE * pfr;
    char m[200];
    
    pfr=fopen(file,"r");
    if (pfr==NULL)
       {printf("ошибка при открытии");
       exit(-1);}
       
    
    while (fgets(m,200,pfr)!=NULL);
    {int i,j;
    M1: if (m[i]!='0' || m[i]!='1'); // если символ неравен 0 или 1, то
    printf("%S %d", m, i);            // вывести его
    esle (m[i]=m[i+1]);                // иначе - перейти к следующему символу 
    goto M1;                             // вернуться к проверке этого символа
    }
    }
     
  5. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    Mosvit

    1. main() - должна возвращать тип int и иметь в конце return 1;
    2. после while сразу стоит ;
    3. int i,j; не надо объявлять в цикле
    4. вместо goto как раз таки используется while

    и ещё:
    :D
     
    3 people like this.
  6. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Если не напутал, то вот поидее
    Code:
    #include <stdio.h>
    
    void main()
    {
    FILE *in;
    char ch;
    
    in = fopen("in.txt", "r");
    
    while(ch != EOF)
            {
             ch = fgetc(in);
             if((ch < 48 || ch > 57) && (ch < 65 || ch > 90) && (ch < 97 || ch > 122)) printf("%c", ch);
            }
    
    fclose(in);
    }
    
     
    _________________________
    1 person likes this.
  7. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    PHP:
    // создал указатель (?) на поток
    ifstream infile;
    // открыл файл
    infile.open ("C:\\file2.txt");
    // пытаюсь получить размер файла
    int size filesize(infile);

    int filesize(ifstream infile){

        
    infile.seekg(0ifstream::end);
        
    int size infile.tellg();
        
    infile.seekg(0);

        return 
    size;
    };
    но не получается.
    ошибка в строке
    PHP:
    int size filesize(infile);
    //  initializing argument 1 of `int filesize2(std::ifstream)'
    как передать этот указатель в функцию, чтобы она определила размер файла?
     
  8. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Напиши
    int filesize(ifstream &infile)
     
    _________________________
  9. draliokero

    draliokero Member

    Joined:
    14 Mar 2009
    Messages:
    83
    Likes Received:
    6
    Reputations:
    0
    Подскажите, как в строковой переменной заменить слово на нужный мне текст.
     
  10. jawbreaker

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

    Joined:
    7 Jul 2008
    Messages:
    156
    Likes Received:
    76
    Reputations:
    3
    Если нужно заменить все вхождения то так:
    Code:
    string s="BugblablaBugBug blabla BuBuggBug";
      string oldS="Bug";
      string newS="";
      int last=0,i;
      while (i=s.find(oldS,last),i!=string::npos)
        last=i+newS.size(),
        s.replace(i,oldS.size(),newS);
    
     
    2 people like this.
  11. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    как ужасно:) нет бы КМП написать..)
     
  12. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Юзай поиск в инете
    Для ленивых вот:
    Code:
    // Функция заменяет в строке Src подстроку Str1 на Str2
    
    char* Replace(char* Src,char* Str1, char* Str2) 
    {
        int        cStr1=0,cStr2=0,i;
        char*    buffer;
        buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,lstrlen(Src)*2);
        while (Str1[cStr1]) cStr1++; // считаем размер
        while (Str2[cStr2]) cStr2++; // строк, можно и через lstrlen
        i = InStr(&Src[0],&Str1[0]);
        while(i != 0)
        {
            lstrcpyn(&buffer[lstrlen(buffer)],&Src[0],i);
            lstrcat(&buffer[0],&Str2[0]);
            lstrcpy(&Src[0],&Src[i+cStr1-1]);
            i = InStr(&Src[0],&Str1[0]);
        }
        lstrcat(&buffer[0],&Src[0]);
        lstrcpy(&Src[0],&buffer[0]);
        HeapFree(GetProcessHeap(),HEAP_NO_SERIALIZE,buffer);
        return Src;
    }
    
     
  13. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    PHP:
        char *str;
        
    cin >> str;

        
    char *mm strcpy(str"free");

        
    cout << mm;
    почему-то выводит "free"..
    а где то, что я поместил в str?
     
  14. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Дак ты же перезаписываешь то что находится в str
     
    1 person likes this.
  15. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    strcpy(str, "free");
    помещение строки "free" по адресу str
    если хочешь чтобы было и то и другое, то юзай strcat для сложения строк
     
  16. Mosvit

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

    Joined:
    5 Mar 2007
    Messages:
    86
    Likes Received:
    16
    Reputations:
    1
    Да, спасибо! Всё работает. Только в начале не void main() походу а int main()

    В условии цифры это какие-то коды символов получается?
    А можно ещё как-нибудь сделать запись полученого результата в текстовый файл, а то русский шрифт полохо отображается в программе? =)
     
    #2756 Mosvit, 25 Apr 2009
    Last edited: 25 Apr 2009
  17. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Напиши в консоле >> file.txt или в коде допиши запись в другой файл.
    Зачем писать int main если функция ничего не возвращает?
     
    _________________________
  18. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Ну вашу ж мать... ну кто так делает? и как так вообще можно? какого хрена оно вообще работает.. это ж..
    короче, по пунктам:
    1)юзинг неинициализированной переменной в ch
    2)в случае достижения eof-а всё равно пытаемся что-то вывести
    3)ну вот обязательно надо всё не по человечески сделать: вот что тебя сподвигло на написание "<48" вместо "<'0'"?

    фикс этого кода, убивающий критические баги 1 и 2:
    Code:
    #include <stdio.h>
    
    void main()
    {
    FILE *in;
    char ch;
    
    in = fopen("in.txt", "r");
    
    while((ch = fgetc(in)) != EOF)
            {
             if((ch < 48 || ch > 57) && (ch < 65 || ch > 90) && (ch < 97 || ch > 122)) printf("%c", ch);
            }
    
    fclose(in);
    }
    
     
    1 person likes this.
  19. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    Я как бэ не программист по образованию и даже не интересующийся (особенно с++), ну да ладно...

    Приведи практический пример, когда мой вариант повлечет за собой ошибку

    ascii коды сподвигли
     
    _________________________
    1 person likes this.
  20. rudvil

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

    Joined:
    25 Aug 2008
    Messages:
    200
    Likes Received:
    29
    Reputations:
    0
    Зачем изобретать велосипед когда он уже сделан?
    Code:
    #include <stdio.h>
    #include <ctype.h>
    
    int main() {
        FILE *in;
        char ch;
        in = fopen("in.txt", "r");
        while(ch != EOF) {
            ch = fgetc(in);
            if(!isalnum(ch)) {
                printf("%c", ch);
            }
        }
        fclose(in);
        return 0;
    }
     
    1 person likes this.
Thread Status:
Not open for further replies.