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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2014, 00:45   #1
Angel_In_Night_Sky
 
Регистрация: 22.04.2014
Сообщений: 8
По умолчанию Ошибка при вводе пустой строки, язык Си

Программа должна разбивать введенную строку на слова, для последующей работы с ними. На слова разбивает, но при вводе пустой строки (т.е. просто при нажатии Enter) вылетает ошибка "Segmentation fault (core dumped)".
Можно ли это как-то исправить? Предполагается, что этот код будет подключаться к основной программе (для обработки команд), и нужно чтобы по Enter не прерывалась работа программы, а просто дублировалась строка приглашения ко вводу
P.S. работа в Linux

Код:
// Обработка введенной команды  //

// word1 word2 word3 ... wordn считывается      
// в массив слов   cmdpart[0]
		// cmdpart[1]
		// cmdpart[2]
		// .....
		// cmdpart[n]
//............................................//


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

main () {

	char cmdpart[10][50];
	char i=0, j=0;
	char str[100];
	char *sp;
	
	printf("Введите команду\n");   
	gets(str);
	sp = strtok(str, " ");
	strcpy(cmdpart[i], sp);
	while (sp) {
		sp = strtok(NULL, " ");
		i++;
		if (sp !=NULL) {
		strncpy(cmdpart[i], sp, sizeof(cmdpart[i])-1);
		}
	}

while (j < i) {
printf("%s ",cmdpart[j]); // проверка 
j++;
}

printf("\n");
return 0;
}
Angel_In_Night_Sky вне форума Ответить с цитированием
Старый 12.05.2014, 01:12   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

А что если просто завершить работу программы, если введена пустая строка? Либо требовать от пользователя ввести НЕПУСТУЮ СТРОКУ, если он ввёл пустую?
Вадим Мошев вне форума Ответить с цитированием
Старый 12.05.2014, 01:23   #3
Angel_In_Night_Sky
 
Регистрация: 22.04.2014
Сообщений: 8
По умолчанию

Так в том то и дело, что при вводе пустой строки программа сразу же завершается в ошибкой "Segmentation fault (core dumped)". Ввод пустой строки должен быть разрешен
Angel_In_Night_Sky вне форума Ответить с цитированием
Старый 12.05.2014, 01:30   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Не проверял, но попробуйте:
Код:
if (sp)
    strcpy(cmdpart[i], sp);
Или такое:
Код:
do {
    printf("Введите команду\n");   
    gets(str);
    sp = strtok(str, " ");
} while (!sp);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.05.2014, 02:26   #5
Angel_In_Night_Sky
 
Регистрация: 22.04.2014
Сообщений: 8
По умолчанию

Спасибо! Второй вариант сработал. А из-за чего происходила ошибка?
Angel_In_Night_Sky вне форума Ответить с цитированием
Старый 12.05.2014, 02:34   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Пожалуйста.
Предположительно:
sp = strtok(str, " "); - в sp оказывался NULL, так как str - пустая строка
strcpy(cmdpart[i], sp); - функция пыталась разыменовать NULL
Но это только предположительно, для более точного ответа нужно смотреть в дебагере.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 21.05.2014, 01:54   #7
Angel_In_Night_Sky
 
Регистрация: 22.04.2014
Сообщений: 8
По умолчанию

всё к той же программе... как можно проверить, является ли cmdpart[i] пустым? т.е. что в него не считано слово?

например, для того чтобы объединить считанные слова?

"пока в cmdpart[i] не пусто объединить "некоторая строка"+cmdpart[i]
i++ " и т.д.

попытки сравнения i-го элемента с пустой строкой "" или с NULL не дали результата
Angel_In_Night_Sky вне форума Ответить с цитированием
Старый 21.05.2014, 02:18   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
char cmdpart[10][50];
int i, j;
for (i = 0; i < 10; ++i)
    cmdpart[i][0] = 0;
...
char s[1000];
s[0] = 0;
j = 0;
while (j < i && cmdpart[j][0])
  sprintf(s, "%s%s", s, cmdpart[j++]);
printf("%s", s);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перевод строки при вводе Chugun Общие вопросы C/C++ 2 12.03.2012 15:38
Ошибка при вводе чисел FennecFox Общие вопросы C/C++ 0 25.01.2011 19:23
Не прекращается ввод при вводе пустой строки sunplant Общие вопросы C/C++ 10 10.06.2010 19:33
Ошибка при вводе даты tools SQL, базы данных 6 05.11.2009 21:12
ошибка при вводе в DBEdit Evgenii БД в Delphi 3 05.08.2009 20:39