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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2009, 00:18   #1
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
Стрелка Проблемы с функцией gets (С)

Есть такое задание:
Дана строка. Преобразовать ее следующим образом: если символ «*» в ней отсутствует, то оставить ее без изменения, иначе – заменить на символ «–» число символов после первого вхождения «*».

Я попытался сделать вот так:

#include<stdio.h>
#include<ncurses.h>

int Star(char str[]);
void Change(char s[],char z[]);

int main ()
{
char str[1000],z[1000];

clear;
printf ("Введите строку с символом '*' или без такового (на ваш выбор):\n");
gets(str);
Change (str,z);
printf(z);
return 0;
getch();
}

int Star (char str[])
{
int n;
for (;str[n]=='*');
return n;
}

void Change (char s[],char z[])
{
int i,k;
k=Star(z);

for (;i>k;i++)
{
if (s[i]==k) z[i]='-';
else z[i]=s[i];
}
}

Однако g++ ругается вот так:
laba_3.cpp: In function ‘int main()’:
laba_3.cpp:15: warning: format not a string literal and no format arguments
/tmp/ccZqFiL6.o: In function `main':
laba_3.cpp (.text+0x32): warning: the `gets' function is dangerous and should not be used.


Не понятно следующее:
1. Почему printf (z); некорректно?
2. Почему компилятор пишет что gets опасна, и если причины есть, то какая может быть альтернатива gets?
3. Как вам вообще такой код? Что следует поправить? Потому что я чувствую что тут далеко не 2 ошибки.

Помогите, пожалуиста.

Заранее спасибо.

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

Цитата:
Сообщение от spirit_trapper Посмотреть сообщение
3. Как вам вообще такой код? Что следует поправить? Потому что я чувствую что тут далеко не 2 ошибки.
У Вас на удивление хорошая интуиция
Ошибок действительно достаточно.
Насчёт 1-го и 2-го вопроса:
1) Он(компилятор) говорит, что в качестве параметра в printf передаётся не строковый литерал, содержащий строку форматирования, а переменная, в которой неизвестно что, более того, за этой переменной не следуют другие параметры. В общем не стоит особо обращать на это внимание, это лишь предупреждение о некорректно использованной функции.

2) gets действительно опасна, потому как не предлагает никаких средств для ограничения ввода, в силу чего может быть "переполнение буфера". Можете попробовать fgets вместо gets.

Немного изменил Вашу программу, будут вопросы - спрашивайте
Код:
#include<stdio.h>
#include<ncurses.h>

int  Star(const char* s);
char* Change(char* s);

int main ()
{
	char str[1000];

	clear();
	printf ("Введите строку с символом '*' или без такового (на ваш выбор):\n");
	fgets(str, 1000, stdin);
	printf( Change (str) );
	getch();

	return 0;
}

int Star(const char* s)
{
	int i;

	for(i = 0; s[i] != 0; i++)
		if(s[i] == '*')
			break;

	if(s[i] == '\0')
		i = -1;

	return i;
}

char* Change (char* s)
{
	int i;
	int pos = Star(s);
	
	if(pos != -1)
		for( i = pos; s[i] != 0; i++ )
			s[i] = '-';

	return s;
}

Последний раз редактировалось netrino; 19.12.2009 в 00:59.
netrino вне форума Ответить с цитированием
Старый 19.12.2009, 01:25   #3
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
По умолчанию

netrino

Спасибо огромное. Буду разбирать код по кусочкам. Вопросы будут.
spirit_trapper вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с функцией и DLL Gott Помощь студентам 4 13.12.2009 20:21
Проблемы с функцией ExitWindowsEx GaWs Win Api 0 20.11.2009 22:12
Проблемы с функцией СЦЕПИТЬ motorway Microsoft Office Excel 20 12.07.2009 01:17
Проблемы с функцией FileWrite Миша Общие вопросы Delphi 5 30.05.2009 19:49
Проблемы с функцией OCIBindByName(). OSKiller PHP 2 19.03.2007 16:48