IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> вопрос по с++
сообщение
Сообщение #1


Гость






Здравствуйте.
Прошу посмотреть следующую программу и сказать, как можно её изменить, чтобы считать строку >= 256 символов

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>

#define BUF 1024
typedef struct node {
char* data;
struct node* next;
} Node;

typedef struct list
{
Node* root;
size_t size;
} List;
int printList( List* list ) {
Node* tmpList = list->root;
printf("List:\n");

if ( NULL == tmpList->next ) printf( "%s\n", "List is empty..." );
else {
tmpList = tmpList->next;
while( NULL != tmpList ) {
printf( "%s", tmpList->data );
tmpList = tmpList->next;
}
}
return 0;
}
List* makeRoot( List* list ) {
list = (List*)malloc(sizeof(List));
list->root = (Node*)malloc(sizeof(List));
list->root->next = NULL;
list->root->data = NULL;
list->size = 0;

return list;
}

Node* makeElem(char * str)
{
Node* node = NULL;
size_t lenght = strlen(str);

node = (Node*)malloc(sizeof(List));
node->data = (char*)malloc(lenght*sizeof(char)+(size_t)1);
node->data = strcpy(node->data, str);

return node;
}
List* insert(char * str, List * list)
{
Node* point = NULL;

if(NULL == list->root->next) {
list->root->next = makeElem(str);
}
else {
for(point = list->root; point->next != NULL; point = point->next){}
point->next = makeElem(str);

}
return list;
}

void deleteList( List* list ) {
Node* point1 = list->root;
Node* point2 = list->root;

while( point2 ) {
point1 = point2->next;
free(point1->data);
free(point1);
point1 = point2;
}
free(list);
}

void getString( char* str ) {
char c;
int i = 0;
while ( '\n' != c ) {
c = getchar();
str[i++] = c;
}
}

void stringScanf( char* str ) {
scanf( "%s", str );
str[ strlen(str) ] = '\n';
}

int main() {
char str[BUF] = {0};
size_t size = 0;

List* list = NULL;

list = makeRoot(list);
//fgets(str, BUF, stdin);
//getString( str );
stringScanf( str );
while( '.' != str[0] ) {
list = insert(str, list);
//fgets(str, BUF, stdin);
//getString(str);
stringScanf( str );
}
printList(list);
//deleteList(list);
return 0;
}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Компиляция происходит в cc в оболочке bash под SVR4

Вот есть такая инфа на ситфоруме- это полноценный ответ? Если можно немного поясните смысл этого фрагмента

Терминалы работают в полностью дуплексном (двустороннем) режиме. Символы можно вводить в любой момент времени, даже когда происходит вывод. Потеря символов происходит только в двух случаях: когда переполняется системный буфер вводимых символов (что случается довольно редко) или когда пользователь накопил максимально допустимое число вводимых символов, а никакая программа их не прочитала. В текущей версии этот предел равен 256 символам. Если предел ввода достигнут, буфер сбрасывается и все сохраненные символы теряются без всякого уведомления.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Смотри. Во-первых, это далеко не С++, это самый настоящий plain-C. Во-вторых, у тебя программа вылетит с coredump-ом, потому как
Node* makeElem(char * str)
{
Node* node = NULL;
size_t lenght = strlen(str);

node = (Node*)malloc(sizeof(List));
node->data = (char*)malloc(lenght*sizeof(char)+(size_t)1);
node->data = strcpy(node->data, str);
node->next = NULL; /* <--- ты забыл вот это !!! */

return node;
}
, ну и в-третьих, при чтении новой строки (хоть через getString, хоть через stringScanf) надо не только добавлять символ '\n', но и после него еще (char)0, иначе при вводе следующей - более короткой строки получишь остаток старой строки.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.11.2020 22:45
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name