Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Пропускает ввод параметра

83K
01 июля 2012 года
Sardj
3 / / 01.07.2012
Была постановка задачи

Ввести строку, распечатать строку и ее длину. Обработать в соответствии с алгоритмом, удалив ведущие пробелы, а последовательность пробелов заменить одним пробелом. Обработку строки оформить функциями. Распечатать результирующую строку. Обработать строку в соответствии с заданием: ограничить каждое слово максимально k – символами (<=k), лишние символы удалить, результат распечатать.

Я написала прогу, только у меня когда надо К вводить , он странно через сканф проходит, не то что бы мимо, просто идет не требуя вводить число. Может кто подсказать чего не правильно?

Вот прога

Код:
#include <stdio.h>
#include <conio.h>

char st1[100],st2[100],st3[100];
int lim=0,i=0,k;

void vvod(char str[100])
{
  printf("\n");

  while((str[lim]=getchar())!=EOF) lim++;
  str[lim]='\0';
}

void delspace(char str[100], char str1[100])

{
     lim=0;
   while(str[lim]!='\0')
    if (str[lim]==' ') lim++;
    else {

       while ((str[lim]!=' ')&&(str[lim]!='\0'))
          {
           str1[i]=str[lim];
           lim++;
           i++;
          }
       if (str[lim]=='\0') str1[i]='\0';
       else {str1[i]=' '; i++;}

     }
   str1[i]='\0';
}

void obr( char str[100],char str1[100],int k)
{
 int n=1;
 lim=0;i=0;

 while (str[lim]!='\0')
  {
    if (str[lim]!=' ') {if(n<=k) {  str1[i]=str[lim];
                    n++;
                    i++;
                  }}
    else  {  n=1;
         str1[i]=' ';
         i++;
      }
    lim++;

  }
}

void main()
{
 printf("\nВведите строку: \n");vvod(st1);

 lim=0;
 while(st1[lim]!='\0') lim++;
 printf("\Длина строки - %d \n", lim);


 delspace(st1,st2);
 printf("\nСтрока без лишних пробелов %s", st2);

 printf("\nВведите число букв которым нужно ограничить слово - ");
 scanf("%d",&k);

 obr(st2,st3,k);
 printf("\nСтрока после обработки \n\n%s", st3);

 getch();

}
  • код оформи кнопочкой {...} в меню от arrjj, 01 июля 2012 года
2.1K
02 июля 2012 года
disputant
95 / / 28.05.2007
Начнем с самого начала:
 
Код:
void vvod(char str[100])
{
  printf("\n");

  while((str[lim]=getchar())!=EOF) lim++;
  str[lim]='\0';
}
Чтоб закончить ввод (получить EOF), надо считывать int, а не char. Т.е. примерно так:

 
Код:
void vvod(char str[100])
{
    printf("\n");
    int input;
    while((input = getchar())!=EOF) str[lim++] = input;
    str[lim]='\0';
}
Впрочем, это только первая из неприятностей :) Например - смущает сам метод чтения строки до EOF... Т.е., прочтя строку, вы должны поток ввода закрыть?
83K
03 июля 2012 года
Sardj
3 / / 01.07.2012
Да я понимаю что знания мои довольно размыты ^_^. Ctrl+z так и закрываем, вроде как в нашем учебном заведении так принято, по другому не показывали, а я и не заинтересовалась (
2.1K
04 июля 2012 года
disputant
95 / / 28.05.2007
Формально - и как потом читать дальше из уже закрытого потока?..

Считывайте строку до символа новой строки (\n). Если строка может быть многострочная - то надо придумывать какой-то иной признак ее окончания: ведь вы затем хотите считывать из потока еще и другие данные...
277
04 июля 2012 года
arrjj
1.7K / / 26.01.2011
мб использовать для чтения scanf("%s[99]",&str); а длину получать через strlen?
2.1K
04 июля 2012 года
disputant
95 / / 28.05.2007
Цитата: arrjj
мб использовать для чтения scanf("%s[99]",&str); а длину получать через strlen?



Не проще ли fgets(str,n,stdin)?

277
04 июля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: disputant
Цитата: arrjj
мб использовать для чтения scanf("%s[99]",&str); а длину получать через strlen?



Не проще ли fgets(str,n,stdin)?


Он лишний символ в конец добавит и все равно длину через strlen получать надо будет.

2.1K
04 июля 2012 года
disputant
95 / / 28.05.2007
Лишний 0 и так и так нужен...
277
04 июля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: disputant
Лишний 0 и так и так нужен...


не лишний ноль а перенос строки (\n) - прочитай описание функции.

2.1K
04 июля 2012 года
disputant
95 / / 28.05.2007
Цитата: arrjj
Цитата: disputant
Лишний 0 и так и так нужен...


не лишний ноль а перенос строки (\n) - прочитай описание функции.



Ну, я же не прошу почитать описание scanf, которая в вашем варианте похерит строку и считает только слово... :)

Кстати, fgets символ \n не добавляет, а не удаляет - а это тоже две большие разницы...

277
04 июля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: disputant
Ну, я же не прошу почитать описание scanf, которая в вашем варианте похерит строку и считает только слово... :)


а кстати да :) тем не менее

Цитата: disputant

Кстати, fgets символ \n не добавляет, а не удаляет - а это тоже две большие разницы...


при вводе из stdin он Enter как \n добавит в конец строки. Добавит потому что в контексте ввода в консоль Enter есть подтверждение а не символ. gets такого не сделает, но в нем нет ограничения на длину.... Остается только cin.getline(char*,int)

83K
04 июля 2012 года
Sardj
3 / / 01.07.2012
Т.е. это из-за того что я входной поток закрываю ? Попробую открыть после ввода строки...

Вместо ввода gets(str), k читает, спасибо )
277
05 июля 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Sardj
Т.е. это из-за того что я входной поток закрываю ? Попробую открыть после ввода строки...


Да не просто getchar EOF вернет только если ошибка чтения стандартного ввода будет или ввод из файла идет (запуск program.exe < 123.txt ), надо проверять на перенос строки.

 
Код:
while((str[lim]=getchar())!='\n') lim++;
Хороший ресурс по документации C++ http://www.cplusplus.com/reference/
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог