Anium |
Отправлено: 09.11.2006, 16:35 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 16
|
Написал прогу, но она работает неправильно... Требуется найти самое длинное и короткое слово введённое в консоли пользователем. Написал код для вывода самого длинного слова, но постоянно самым длиинным словом оказывается первое...
CODE | // Самое длинное слово
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <alloc.h>
#include <vcl.h>
# define ENTER 13
void main (void)
{int n=80,i,j,begin,length=0;
char ch,*txt=(char*)calloc(n,sizeof(char));
clrscr();
puts("ENTER-конец ввода");
for(i=0;(ch=getche())!=ENTER;i++)
{if(i==n-1){n+=80;txt=(char*)realloc(txt,n*sizeof(char));}
txt[i]=ch;
if(ch==' ')
{for(j=i;(txt[j-1]!=' ')&&(j>0);j--);
if(i-j>length) {length=i-j;begin=j;}
}
}txt[i]=NULL;
puts("\nСамое длинное слово:");
for(i=begin;i<length+begin;i++)
printf("%c",txt[i]);
free(txt);
getche();
} |
Отредактировано Anium — 09.11.2006, 16:36 |
|
beginner |
Отправлено: 09.11.2006, 17:31 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 44
|
Ты не проверяешь последнее слово.
После
txt[i]=NULL;
нужно бы
if((i>0)&&(txt[i-1]!=' ')
{
подсчет длины.
}
Кроме этого, вместо
for(j=i;(txt[j-1]!=' ')&&(j>0);j--);
лучше бы
for(j=i;(j>0)&&(txt[j-1]!=' ');j--);
Если ввести одну переменную lastSpPos, в которую записывать
позицию последнего пробела, то можно обойтись без цикла. |
|
AVC |
Отправлено: 09.11.2006, 17:48 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE |
Требуется найти самое длинное слово введённое в консоли
|
Эх, вспомним молодость и турбо С
CODE |
#include <stdio.h>
//.......................................................
//=======================================================
void main (int arg_cou, char** arg_cnt)
{
char str [200], *cp, *lng;
int i, maxlen, curlen;
char c;
// вводим слова
for (i=0; i < (sizeof(str)-2); i++)
{ c = getchar();
if (c == '\n') break;
str[i] = c;
}
str [i] = ' ';
str [i+1] = 0x00;
// найти самое длинное
cp = lng = str;
maxlen = 0;
for (i=0; str[i]; i++)
{ if (str[i] == ' ') // слово кончилось
{ if (*cp == ' ') // пробросить группу пробелов
{ cp = str+i; continue; }
curlen = (str+i) — cp;
if (curlen > maxlen) // это слово длиннее ?
{ maxlen = curlen; lng = cp; }
str[i] = 0x00;
printf("<%s> %2d %2d\n", cp, curlen, maxlen); // отладка
cp = str + i + 1;
}
else // не кончилось
{ if (*cp == ' ') cp = str + i;
}
}
printf("Самое длинное оказалось <%s>\n", lng);
getchar();
}
//-------------------------------------------------------
| |
|
Anium |
Отправлено: 09.11.2006, 18:00 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 16
|
Спасибо! |
|
Anium |
Отправлено: 07.12.2006, 11:35 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 16
|
А можно поинтересоваться смыслом этих строчек?:
1. str [i] = ' ';
2. str [i+1] = 0x00;
3. for (i=0; i < (sizeof(str)-2); i++) // интересует роль sizeof
|
|
AVC |
Отправлено: 07.12.2006, 12:29 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE | А можно поинтересоваться смыслом этих строчек?: |
Можно.
Добавляетс к вводу пробел так как алгоритм стчитает что слово всегда ограничено пробелом
QUOTE | 2. str [i+1] = 0x00; |
добавляет байт 0 для приведения строки к формату asciiz
QUOTE | 3. for (i=0; i < (sizeof(str)-2); i++) // интересует роль sizeof |
Рассчитывает размер буфера приемника дабы не выйти за границу массива. |
|
Anium |
Отправлено: 07.12.2006, 14:10 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 16
|
QUOTE | добавляет байт 0 для приведения строки к формату asciiz |
а что это за формат и зачем нужно приводить строку к этому формату?
QUOTE | Рассчитывает размер буфера приемника дабы не выйти за границу массива. |
(sizeof(str)-2)
а почему именно минус 2?
Отредактировано Anium — 07.12.2006, 14:11 |
|
AVC |
Отправлено: 07.12.2006, 15:13 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (Anium @ 07.12.2006, 13:10) |
а что это за формат и зачем нужно приводить строку к этому формату?
|
строка ascii оганиченная байтом со значением 0. Предвосхищая дальнейший вопрос — 0 в конце строки нужен что бы сработало условие выхода из цикла for (i=0; str[i]; i++)
запись str[i] эквивалентна str[i] != 0
QUOTE (Anium @ 07.12.2006, 13:10) |
а почему именно минус 2?
|
потому что str [предпоследний] = ' ' а str [последний] = 0x00
-2 резервиреут 2 байта для этих присвоений. |
|
Anium |
Отправлено: 07.12.2006, 16:06 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 16
|
Ясно, благодарю |
|