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. Сразу извиняюсь за быдло-код. Только знакомлюсь с С++
Взял код из учебника по СИ, но он не работает, выдает кучу ОШИБОК Подскажите в чём может быть дело? Код полностью скопирован с книги. Книга (Б. Керниган, Д. Ритчи / Язык программирования Си / Издание 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; }
ошибка в том, что ты передаешь функции 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; }
поправил ошибки, что делает программа не вкурил 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-ую строку кода - нельзя обьявлять переменную типа int, при этом перед этим обьявить #define макроподстановку MAXLINE. -- Мой тебе совет, начни лучше читать книгу из этой темы, C++. -- Если ссылка умерла, ПМ, я скину.
Программа удаляет все пробелы и \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.
помогите с вводом массива... вообщем длина массива не известна, надо ввести массив, и окончанием ввода массива служит введенное число которое отличается знаком с первым введённым числом
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; }
нет проблем, держи 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; }
блин не то, это то я тоже сделал) я наверно не так сформулировал, извини, надо чтобы просто как только знак меняется (по сравнению с 1 введённым числом) массив завершался... и потом надо бы найти последнее чётное число в этом массиве и выкинуть его... и затем перевернуть массив задом на перёд но это я сам как нибудь попробую
помогите исправить... // Ввести массив чисел, количество которых заранее не известно. Ввод массива заканчивается вводом числа, имеющего противоположный знак по сравнению с первым введённым числом. Без использования другого массива удалить последний элемент, значение которого чётно и переставить элементы в массиве в противоположном порядке. пример: ввод: 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; }
Как динамически выделить память под 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); } Как сделать двухмерный?
Здравствуйте, уважаемые форумчане! Вот нашел задачку, никак не могу решить. Не поможете? Два прямоугольника заданы целочисленными координатами пары диагональных вершин в прямоугольной системе координат, причем их стороны гарантированно параллельны осям. Найти площадь общей части прямоугольников. Технические условия. Программа считывает с клавиатуры (устройства стандартного ввода) 4 пары целых чисел (каждое по модулю не превышает 10^6). Программа выводит на экран (устройство стандартного вывода) единственное число - искомую величину. Пример. Введение 4 7 8 -3 2 4 9 1 Вывод 12
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; Вообщем данная функция считает "максимум среди сумм элементов диагоналей, параллельной главной диагонали" Проблема вот в чем,она считает правильно,но не берет в счет саму главную диагональ как это сделать?
#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); К сожалению не могу вставить картинку графика.
тест не проходит - результат 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"); } может у кого-то есть идеи лучше?
слишком заумно что-то должно быть проще, у тебя в условии ничего не сказано про размеры прямоугольников какой больше какой меньше условие задачи 100% верно?
Есть странный typedef не пойму что он делает точно. typedef void (NSyset::CSysetProcess::*onProcessStep)(ProcessPtr processPtr, bool success); Т.е. OnProcessStep это void (*)(ProcessPtr processPtr, bool success) ?