[ 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. moodoone

    moodoone Member

    Joined:
    21 Oct 2009
    Messages:
    205
    Likes Received:
    38
    Reputations:
    5
    Code:
    #include "StdAfx.h"
    #include <iostream> 
    #include <string> 
    using namespace std;
    static char del(char* line);
    int main() { 
     int n=1000000;
     int lic=0;
    string Buf[1000000];
    char* temp;
     FILE * in = fopen("text.txt", "r+");
     while(!feof(in)) {
    	           fgets(temp, n, in);
    			   Buf[lic]=temp;
    				lic++;
    				}
     for (int i=0;i<lic-1;i++)
     {
    strcpy(temp, Buf[i].c_str());
    Buf[i]=del(temp);
     }
    
      for (int i=0;i<lic-1;i++)
     {
     fprintf(in, "%s",Buf[i]);
     }
    
      fclose(in);
    	cin.get();
    	
        return 0; 
    } 
    
    static char del( char* line)//функция удаляет все пробелы и т.д.
     {  
       int size = strlen(line); 
    
       
        if (size > 0 && line[size - 1] == '\n') {
            line[size - 1] = 0; --size;
        }
        if (size > 0 && line[size - 1] == '\r') {
            line[size - 1] = 0; --size;
        }
        return *line ;
    }
    Помогите пожалуйста с кодом. Программа должна в текстовом файле удалять пробелы и символы перехода на новую строку в конце строки.
    За 4 часа мучений я кое что написал. Программа компилируется, но тут же вылетает ошибка Stack overflow.
    Помогите найти ошибки или предложите свой ​​вариант. Буду очень благодарен.
    P.S. Сразу извиняюсь за быдло-код. Только знакомлюсь с С++
     
    #6821 moodoone, 6 Nov 2011
    Last edited: 6 Nov 2011
  2. masterlights

    masterlights New Member

    Joined:
    20 Oct 2011
    Messages:
    47
    Likes Received:
    0
    Reputations:
    0
    Взял код из учебника по СИ, но он не работает, выдает кучу ОШИБОК
    [​IMG]

    Подскажите в чём может быть дело?
    Код полностью скопирован с книги.
    Книга (Б. Керниган, Д. Ритчи /
    Язык программирования Си / Издание 3-е)

    *если проблема в моей копии книги(что скорее всего, т.к. не первый код уже такой), то скиньте ссылку на нормальную копию)

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXLINE 1000 /* максимальный размер вводимой строки */
    
    int getline(char line[], int MAXLINE);
    void copy(char to[], char from[]);
    
    /* печать самой длинной строки */
    void main(void)
    {
        int len; /* длина текущей строки */
        int max; /* длина максимальной из просмотренных строк */
        char line[MAXLINE]; /* текущая строка */
        char longest[MAXLINE]; /* самая длинная строка */
    
        max = 0;
        while (len = getline(line, MAXLINE)) > 0)
            if (len > max) 
    		{
                max = len;
                copy(longest, line);
            }
        if (max > 0) /* была ли хоть одна строка? */
            printf("%s", longest);
        }
    
    
    /* getline: читает строку в s, возвращает длину */
    int getline(char s[], int lim)
    {
        int c, i;
    
        for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
            s[i] = c;
        if (c == '\n') {
            s[i] = c;
            ++i;
        }
        s[i] = '\0';
        return i;
    }
    
    /* copy: копирует из 'from' в 'to'; to достаточно большой */
    void copy(char to[], char from[])
    {
        int i;
    
        i = 0;
        while ((to[i] = from[i]) != '\0')
            ++i;
    }
    
    
    
     
  3. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    206
    Likes Received:
    31
    Reputations:
    1
    ошибка в том, что ты передаешь функции strcpy указатель без выделенной памяти. Функция пытается что то в него записать, но так как память не выделена, происходит переполнение. Вот рабочий:
    Code:
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    void clear(char * src, char * dest);
    int main()
    {
       char text[1024*10] = "";
       char clean_text[1024*10] = "";
       char buf[256];
       FILE * fin = fopen("text.txt","r+");
       while(fgets(buf,255,fin))
          strcat(text,buf);
       clear(text,clean_text);
       cout << clean_text << endl;
       fclose(fin);
       return 0;
    }
    
    void clear(char * src, char * dest){
       int length = strlen(src);
       for(int i = 0, x = 0; i < length; i++){
          if(src[i] == '\r' || src[i] == '\n' || src[i] == ' ')
             continue;
          else
             dest[x++] = src[i];
       }
       return;
    }
     
    #6823 awdrg, 6 Nov 2011
    Last edited: 6 Nov 2011
    1 person likes this.
  4. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    206
    Likes Received:
    31
    Reputations:
    1
    поправил ошибки, что делает программа не вкурил
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    //#define MAXLINE 1000 /* максимальный размер вводимой строки */
    const int MAXLINE = 1000;
    int getline(char line[], int MAXLINE);
    void copy(char to[], char from[]);
    
    /* печать самой длинной строки */
    int main()
    {
       int len; /* длина текущей строки */
       int max; /* длина максимальной из просмотренных строк */
       char line[MAXLINE]; /* текущая строка */
       char longest[MAXLINE]; /* самая длинная строка */
    
       max = 0;
       while ((len = getline(line, MAXLINE)) > 0)
       {
          if (len > max) 
          {
             max = len;
             copy(longest, line);
          }
          if (max > 0)
             printf("%s", longest);
       }
       return 0;
    }
    
    
    /* getline: читает строку в s, возвращает длину */
    int getline(char s[], int lim)
    {
       int c, i;
    
       for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
       s[i] = c;
       if (c == '\n') {
          s[i] = c;
          ++i;
       }
       s[i] = '\0';
       return i;
    }
    
    /* copy: копирует из 'from' в 'to'; to достаточно большой */
    void copy(char to[], char from[])
    {
       int i = 0;
       while ((to[i] = from[i]) != '\0')
          ++i;
    }
    
     
  5. br3k

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

    Joined:
    19 Sep 2007
    Messages:
    132
    Likes Received:
    107
    Reputations:
    17
    Ошибка явно в книге.
    Взглянув на 5-ую строку кода - нельзя обьявлять переменную типа int, при этом перед этим обьявить #define макроподстановку MAXLINE.
    --
    Мой тебе совет, начни лучше читать книгу из этой темы, C++.
    --
    Если ссылка умерла, ПМ, я скину.
     
    #6825 br3k, 6 Nov 2011
    Last edited: 6 Nov 2011
  6. moodoone

    moodoone Member

    Joined:
    21 Oct 2009
    Messages:
    205
    Likes Received:
    38
    Reputations:
    5
    Программа удаляет все пробелы и \n, а мне нужно только те которые в конце строки. Например есть текст:
    Code:
     
    English Club ESL Learning Centre is where you'll find 
     lessons and resources to help you learn English.   
    If you're an ESL or EFL student, you'll find the online English   
    lessons here useful to learn or revise all aspects of English. 
    
    Нужно что бы получился такой и записать его нужно в тот же файл.
    Code:
     
    English Club ESL Learning Centre is where you'll find lessons and resources to help you learn English.If you're an ESL or EFL student, you'll find the online Englishlessons here useful to learn or revise all aspects of English. 
    
     
  7. XaKeR-SpAm

    XaKeR-SpAm New Member

    Joined:
    18 Jun 2009
    Messages:
    19
    Likes Received:
    2
    Reputations:
    0
    помогите с вводом массива...
    вообщем длина массива не известна, надо ввести массив, и окончанием ввода массива служит введенное число которое отличается знаком с первым введённым числом
     
  8. thrust

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

    Joined:
    20 Jul 2011
    Messages:
    57
    Likes Received:
    41
    Reputations:
    31
    Code:
    	const int n=100;
    	int mass[n];
    	int x;
    	for(int i=0;i<n;i++)
    	{
    		cin>>x;
    		if(i!=0 && x==-mass[0])break;
    		else mass[i]=x;
    	}
    
     
  9. awdrg

    awdrg Member

    Joined:
    30 Jan 2009
    Messages:
    206
    Likes Received:
    31
    Reputations:
    1
    нет проблем, держи
    Code:
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    void clear(char * src, char * dest);
    int main()
    {
       char text[1024*10] = "";
       char clear_text[1024*10] = "";
       char buf[256];
       FILE * fin = fopen("text.txt","r+");
       while(fgets(buf,255,fin))
          strcat(text,buf);
       fclose(fin);
       clear(text,clear_text);
       cout << clear_text << endl;
       fin = fopen("text.txt","w");
       fputs(clear_text,fin);
       fclose(fin);
       return 0;
    }
    
    void clear(char * src, char * dest){
       int length = strlen(src);
       int m;
       for(int i = 0, x = 0; i < length; i++){
          if(src[i] == '\r' || src[i] == '\n'){
          m = 2;
          while(src[i - (m++)] == ' ')
             x--;
          m = 1;
          while(src[i+(m++)] == ' ')
             i++;
          continue;
       }
          else
             dest[x++] = src[i];
       }
       return;
    }
    
     
    #6829 awdrg, 6 Nov 2011
    Last edited: 6 Nov 2011
  10. XaKeR-SpAm

    XaKeR-SpAm New Member

    Joined:
    18 Jun 2009
    Messages:
    19
    Likes Received:
    2
    Reputations:
    0
    блин не то, это то я тоже сделал)
    я наверно не так сформулировал, извини, надо чтобы просто как только знак меняется (по сравнению с 1 введённым числом) массив завершался...
    и потом надо бы найти последнее чётное число в этом массиве и выкинуть его... и затем перевернуть массив задом на перёд но это я сам как нибудь попробую
     
    #6830 XaKeR-SpAm, 7 Nov 2011
    Last edited: 8 Nov 2011
  11. XaKeR-SpAm

    XaKeR-SpAm New Member

    Joined:
    18 Jun 2009
    Messages:
    19
    Likes Received:
    2
    Reputations:
    0
    помогите исправить...
    // Ввести массив чисел, количество которых заранее не известно.
    Ввод массива заканчивается вводом числа, имеющего противоположный
    знак по сравнению с первым введённым числом.
    Без использования другого массива удалить последний элемент, значение
    которого чётно и переставить элементы в массиве в противоположном порядке.
    пример: ввод: 3 7 4 5 2 -7 ответ -7 5 4 7 3


    // ошибка в том что он последний элемент тоже удаляет, хотя по условию не надо... и в visual 2010 вечные ошибки но работает, подправьте если явные ошибки есть...

    #include <stdio.h>
    #include <stdlib.h>
    void main (void)
    {
    int *p,*t,n=1,j,x;
    printf("Введите элементы массива: ");
    p=(int*)malloc(n*sizeof(int));
    scanf("%d",&p[0]);
    for(;;)
    {
    scanf("%d",&x);
    if(p[0]*x<0) break;
    t=(int*)malloc(++n*sizeof(int));
    for(p[n-1]=x,j=n;--j>=0;t[j]=p[j]);
    free(p); p=t;
    }
    for(j=0;j < n;printf("%d ",p[j++])); printf("\n");
    for(x=1,j=n-1;j>=0;) if(p[j--]%2); else { x=0; break; }
    if(x) printf("В массиве нет чётных элементов!\n");
    else for(printf("последний чётный элемент имеет индекс %d\n",j+1),++j,--n;j < n;) p[j++]=p[j+1];
    for(j=0;j < n/2;j++) p[j]^=p[n-j-1],p[n-j-1]^=p[j],p[j]^=p[n-j-1];
    for(j=0;j < n;printf("%d ",p[j++])); printf("\n");
    free(p);
    return;
    }
     
  12. AnGeI

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

    Joined:
    8 Dec 2008
    Messages:
    457
    Likes Received:
    80
    Reputations:
    16
    Как динамически выделить память под 2-х мерный массив, использую alloc.h
    Есть пример трехмерного:
    Code:
    int n=5,m=3,k=4,i,j,l,с;
    
    //размер памяти под указатель - 2 
    //байты, sizeof(char**)=2
    
     char ***Cube = (char***)calloc(n,sizeof(char**));
       for(i=0;i<n;i++)
    {
         Cube[i] = (char**)calloc(m,sizeof(char*));
         for(j=0;j<m;j++)
           Cube[i][j] = (char*)malloc(k);
    }
    
    Как сделать двухмерный?
     
    #6832 AnGeI, 13 Nov 2011
    Last edited: 13 Nov 2011
  13. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    Здравствуйте, уважаемые форумчане! Вот нашел задачку, никак не могу решить. Не поможете?

    Два прямоугольника заданы целочисленными координатами пары диагональных вершин в прямоугольной системе координат, причем их стороны гарантированно параллельны осям. Найти площадь общей части прямоугольников.

    Технические условия. Программа считывает с клавиатуры (устройства стандартного ввода) 4 пары целых чисел (каждое по модулю не превышает 10^6). Программа выводит на экран (устройство стандартного вывода) единственное число - искомую величину.

    Пример.
    Введение
    4 7 8 -3 2 4 9 1
    Вывод
    12
     
  14. juzam

    juzam New Member

    Joined:
    18 Oct 2010
    Messages:
    49
    Likes Received:
    2
    Reputations:
    0
    char **p;
    char **p = (char**)malloc(n);
    for(int i=0; i<n; i++)
    char = (char*)malloc(m);
     
  15. A.N.O.N.I.M

    A.N.O.N.I.M Banned

    Joined:
    20 May 2010
    Messages:
    75
    Likes Received:
    3
    Reputations:
    0
    Code:
    int i,j, max = 0,sum = 0,index = n-1,dlina = 1;
        while(index)
        {
            for(i = 0,j = index; i < dlina; ++i, ++j)
                sum += matr[i][j];
            if (max < sum)
            {
                max = sum;
            }
            sum = 0;
            for(i = 0, j = index; i < dlina; ++i, ++j)
                sum += matr[j][i];
            if (max < sum)
            {
                max = sum;
            }
            sum = 0;
            ++dlina;
            --index;
        }	
        cout<<"Result : "<<max<<"\n";
    	return sum;
    Вообщем данная функция считает "максимум
    среди сумм элементов диагоналей, параллельной главной диагонали"

    Проблема вот в чем,она считает правильно,но не берет в счет саму главную диагональ как это сделать?
     
  16. dickivs

    dickivs New Member

    Joined:
    12 Nov 2011
    Messages:
    28
    Likes Received:
    1
    Reputations:
    0
    #include<iostream>

    using namespace :: std;

    void main()
    {
    int x1,x2,x3,x4,
    y1,y2,y3,y4; // координаты четырех диагональных вершин

    cout<<"Введите координаты диагональных вершин\n пересекающихся прямоугольников (ввод парами: x,y ): ";
    cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
    cout<<"Площадь пересечения прямоугольников ровна: "<<(x2-x3)*(y1-y4)<<endl<<endl;

    }

    должно быть так
    начерти график на графике в результате пересечений прямоугольников ABCD и KLMN образуется четырехугольник NFBE - прямоугольник, стороны которого параллельны осям координат. Т.к. абсциссы точек N и F равны, то NF=y1-y4.
    Т.к. ордианты точек N и Е равны, то NЕ=x2-x3.
    SNFBE=NE*NF=(x2-x3)*(y1-y4);
    К сожалению не могу вставить картинку графика.
     
    #6836 dickivs, 16 Nov 2011
    Last edited: 16 Nov 2011
  17. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    тест не проходит - результат 36 при нужном 12(

    ЗЫ: в общем написал такой вот жуткий код:
    Code:
    #include "stdafx.h"
    #include<iostream>
    
    using namespace std;
    
    void main()
    {
    	int x1 = 0,x2 = 0,x3 = 0,x4 = 0,
    	y1 = 0,y2 = 0,y3 = 0,y4 = 0; // координаты четырех диагональных вершин
    	int s = 0;
    
    	cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4;
    
    	if(x1 < x3 && x1 < x4 && x2 < x4 && x3 < x2 && y1 < y3 && y2 < y3 && y1 > y4 && y2 < y4)
    		s = (x2 - x3) * (y1 - y4);
    	if(x1 < x3 && x1 < x4 && x2 > x4 && x2 > x3 && y1 < y3 && y4 < y1 && y4 > y2 && y3 > y2)
    		s = (x4 - x1) * (y3 - y4);
    	if(x3 < x1 && x4 > x1 && x2 > x4 && x2 > x3 && y3 > y1 && y1 > y4 && y2 < y4 && y3 > y2)
    		s = (x4 - x1) * (y1 - y4);
    	if(x3 < x1 && x1 < x4 && x2 > x4 && x2 > x3 && y1 > y3 && y1 > y4 && y2 < y4 && y3 > y2)
    		s = (x4 - x1) * (y3 - y4);
    	if(x1 > x3 && x1 < x4 && x2 > x4 && x2 > x3 && y1 > y3 && y1 > y4 && y2 < y3 && y2 > y4)
    		s = (x4 - x1) * (y3 - y2);
    	if(x1 < x3 && x1 < x4 && x2 > x3 && x2 > x4 && y1 > y3 && y1 > y4 && y2 < y3 && y2 > y4)
    		s = (x4 - x3) * (y3 - y2);
    	if(x1 < x3 && x1 < x4 && x2 > x3 && x2 < x4 && y1 > y3 && y1 > y4 && y2 < y3 && y2 > y4)
    		s = (x2 - x3) * (y3 - y2);
    	if(x1 < x3 && x1 < x4 && x2 > x3 && x2 < x4 && y1 > y3 && y1 > y4 && y2 < y3 && y2 < y4)
    		s = (x2 - x3) * (y3 - y4);
    	if(x1 <= x3 && x1 < x4 && x2 > x3 && x2 >= x4 && y1 >= y3 && y1 > y4 && y2 < y3 && y2 <= y4)
    		s = (x4 - x3) * (y3 - y4);
    	if(x1 < x3 && x1 < x4 && x2 > x3 && x2 > x4 && y1 < y3 && y1 > y4 && y2 < y3 && y2 > y4)
    		s = (x4 - x3) * (y1 - y2);
    	if(x1 > x3 && x1 < x4 && x2 > x3 && x2 < x4 && y1 > y3 && y1 > y4 && y2 < y3 && y2 < y4)
    		s = (x2 - x1) * (y3 - y4);
    
    	cout << s << endl;
    	system("pause");
    }
    может у кого-то есть идеи лучше?
     
    #6837 maked0n, 16 Nov 2011
    Last edited: 16 Nov 2011
  18. dickivs

    dickivs New Member

    Joined:
    12 Nov 2011
    Messages:
    28
    Likes Received:
    1
    Reputations:
    0
    слишком заумно что-то должно быть проще, у тебя в условии ничего не сказано про размеры прямоугольников какой больше какой меньше условие задачи 100% верно?
     
  19. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Есть странный typedef не пойму что он делает точно.
    typedef void (NSyset::CSysetProcess::*onProcessStep)(ProcessPtr processPtr, bool success);

    Т.е. OnProcessStep это void (*)(ProcessPtr processPtr, bool success) ?
     
  20. Lee_fx

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

    Joined:
    27 Sep 2008
    Messages:
    92
    Likes Received:
    14
    Reputations:
    0
    onProcessStep указатель на функцию класса CSysetProcess.
    NSyset видимо неймспейс.
     
Loading...
Thread Status:
Not open for further replies.