Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2009, 22:02   #1
Anarki
Пользователь
 
Аватар для Anarki
 
Регистрация: 13.09.2009
Сообщений: 29
Вопрос Строки

Помогите найти ошибку, в программе где нужно заполнить строки. При заполнении какой то строки словами разделяющимися пробелами, ввод последующий строки весьма странный, но если заполнять строки без пробелов, то всё нормально. Далее следует непонятный вывод этих строк в отдельном цикле.
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

int i,n;
char *st[10];

int vvod ()
{
   printf ("\n vvedite kolichestvo strok :\n n=");
   scanf ("%d",&n);
   for (i=0; i<n; i++)
   {
      printf ("\n %d: ",i);
      scanf ("%s",&st[i]);
   }
   for (i=0; i<n; i++)
   {
      printf ("\n %d: %s",i,&st[i]);
   }
   return 0;
}
Вывод программы:
Код:
vvedite kolichestvo strok:
n=3
0: 123     //Заполняем строки 0,1,2
1: 456
2: abc
0: 124abc   //Вывод этих строк
1: 45abc
2: abc
Вывод с пробелами:
Код:
vvedite kolichestvo strok:
n=3
0: onotole ololo
1:              //Следующая строка почему то пропускается о_О
2: abcde
0: onolabcde
1: olabcde
2: abcde

Последний раз редактировалось Anarki; 18.09.2009 в 22:05.
Anarki вне форума Ответить с цитированием
Старый 18.09.2009, 22:12   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Да, собственно, ничего странного, вы ведь объявили десять указателей на строки, но не десять буферов... Более того передаёте в scanf в качестве буфера указатель на этот массив о_О то есть вместо хранения указателей вы используете его для хранения конкретных строк... Короче, надо выделить какую-то память под строки, например вместо
Код:
char* st[10];
написать
Код:
char st[10][10];
И уберите амперсанд(&) из scanf и printf
netrino вне форума Ответить с цитированием
Старый 18.09.2009, 22:18   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

в дополнение:

scanf считывает строку до первого пробела, используйте gets
counter вне форума Ответить с цитированием
Старый 18.09.2009, 23:00   #4
Anarki
Пользователь
 
Аватар для Anarki
 
Регистрация: 13.09.2009
Сообщений: 29
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
в дополнение:

scanf считывает строку до первого пробела, используйте gets
Как gets запишется с двумерным массивом который предложил netrino ?
Anarki вне форума Ответить с цитированием
Старый 18.09.2009, 23:09   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Anarki Посмотреть сообщение
Как gets запишется с двумерным массивом который предложил netrino ?
Точно так же)
Код:
gets(st[i]);
netrino вне форума Ответить с цитированием
Старый 18.09.2009, 23:14   #6
Anarki
Пользователь
 
Аватар для Anarki
 
Регистрация: 13.09.2009
Сообщений: 29
По умолчанию

Получается проблемный ввод. Первая строка отбрасывается.
Вы бы не могли изменить мой код как вы считаете правильным ? В си не так опытен, поэтому могу делать мелкие ошибки.
Anarki вне форума Ответить с цитированием
Старый 18.09.2009, 23:25   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Чтобы не отбрасывалась, добавьте fflush(stdin);
Код:
int vvod ()
{
	int i, n;
	char st[10][30];

	printf ("\n vvedite kolichestvo strok :\n n=");
	scanf ("%d",&n);
	fflush(stdin);

	for (i=0; i<n; i++) {
		printf ("\n %d: ", i);
		gets(st[i]);
	}

	for (i=0; i<n; i++) {
		printf ("\n %d: %s\n", i, st[i]);
	}

	return 0;
}
netrino вне форума Ответить с цитированием
Старый 18.09.2009, 23:34   #8
Anarki
Пользователь
 
Аватар для Anarki
 
Регистрация: 13.09.2009
Сообщений: 29
По умолчанию

netrino спасибо
Anarki вне форума Ответить с цитированием
Старый 28.11.2009, 03:22   #9
Esso
 
Регистрация: 16.10.2009
Сообщений: 9
По умолчанию

У меня на подобее этого задача.Не могу просто вьехать как
это сделать.Нужно выделить часть текста между словами,введенный с клавиатуры.Может кто знает каким образом это записать?Я просто не могу вьехать в суть вопроса...
Esso вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перенести символа с начала строки в место перед запятой этой же строки. Zhiltsov Microsoft Office Excel 4 05.06.2009 13:10
Строки. Как вывести часть строки? Anfall Общие вопросы Delphi 7 26.02.2009 09:10
строки pakusya Паскаль, Turbo Pascal, PascalABC.NET 8 01.12.2008 02:42
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
как вывести строку поочередно сначала первая буква первой строки потом первая буква второй строки и т.д. vitalik007 Помощь студентам 1 25.09.2007 20:45