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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2014, 01:36   #1
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию Дана строка,удалить 1-ое слово(Язык Си)

Не используя функции стандартной библиотеки Си для работы со строками, кроме указанных написать собственную функцию ,реализующую алгоритм. Дана строка содержащая слова разделённые пробелами. Удалить первое слово строки.

Код,сказали неправильный(((

Код:
Void firstword(char*str);
if (str==NULL) 
return; 
int i=strlen(str);
while(str[i] != ‘ ‘);
++i; 
str[i]=’\0’; 
}
Otar4ik вне форума Ответить с цитированием
Старый 14.09.2014, 07:08   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

А что неправильно не сказали?
Ты запускал код? Видел что он делает?

Этот код с заданием слабо связан, но даже если бы он был правильный, то ты же видишь, что он strlen вызывает, а у тебя сказано:
Цитата:
Не используя функции стандартной библиотеки Си для работы со строками
Начни с примеров. Напиши как на твой взгляд должна работать программа?

Последний раз редактировалось rrrFer; 14.09.2014 в 07:10.
rrrFer вне форума Ответить с цитированием
Старый 14.09.2014, 07:21   #3
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Код:
#include <stdio.h>
#include <malloc.h>
void main()
{
int f, i, j;
char* str = (char*) malloc(100*sizeof(char));
str[0]='s'; str[1]='t'; str[2]='r'; str[3]=' '; str[4]='s'; str[5]='t'; str[6]='r'; str[7]='\0';
for(f=0,i=0,j=0; str[i]!='\0'; i++)
if(f==0&&str[i]==' ') f=1;
else if (f==1){str[j]=str[i]; j++;}
str[j]='\0'; printf("%s\n", str);
}
strlen это функция стандартной библиотеки string.h для работы со строками.
Кавычки для символов - '. На кавычке типа ` выдает ошибку: неизвестный символ 0x60.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 14.09.2014, 07:43   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

По заданию надо написать функцию, а не запихать все в main
rrrFer вне форума Ответить с цитированием
Старый 14.09.2014, 09:45   #5
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
А что неправильно не сказали?
Ты запускал код? Видел что он делает?

Этот код с заданием слабо связан, но даже если бы он был правильный, то ты же видишь, что он strlen вызывает, а у тебя сказано:


Начни с примеров. Напиши как на твой взгляд должна работать программа?
на зачёте писал,преподаватель проверял вручную и сказал неправильно и нет зачёта(((

но за strlen он ничего не сказал,а вот что после цикла у него вызвало много вопросов.

Я программу представлял так-мы проходим по всей строке циклом, а потом уже ищем первый с начала строки пробельный символ и следующее слово за ним и там устанавливаем наш курсов,ясное дело не через '\0' а как ещё можно?

То есть он прошёл слово увидел пробел и там остановился.На словах это легко представил.
Otar4ik вне форума Ответить с цитированием
Старый 14.09.2014, 09:51   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

challengerr первое что бросается в глаза. Выделили 100 char динамически.
А что дальше с этой памятью?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 14.09.2014, 09:55   #7
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

ПО ушам ты ездишь и препод это заметил.

Функцию ты где-то без изменений скопипастил - называется она ПервоеСлово и скорее всего она отрежет от строки как раз это слово.

Цитата:
и следующее слово за ним и там устанавливаем наш курсов
Эта функция ставил \0 сразу за первым словом, никакое следующее слово тут не ищется.

\0 - это конец строки, т.т.е. если у тебя была строка "мама мыла раму\0" - то твоя функция запишет "мама\0мыла раму\0", а что должно быть - я не знаю - напиши примеры, я ж сказал в первом посте.

Отрежет, если ты перепишешь ее как-нибудь конечно. Сейчас она ваще ниче не делает:
Код:
int i=strlen(str);
while(str[i] != ‘ ‘);
Тут ты записал в i - номер последнего символа строки (который '\0').
И естественно, str[i] не равен пробелу.
Дальше ты увеличиваешь i и шпаришь уже не по своей строке, а по мусору в памяти, находишь среди мусора первый пробел и заменяешь его на \0.
Мусором может оказаться что-то полезная и программа может сломаться (зависит от фазы луны).

Даже не так.
Код:
while(str[i] != ‘ ‘);
тут программа тупо зацикливается, ты поставил стопудов лишнюю точку с запятой после while.

Последний раз редактировалось rrrFer; 14.09.2014 в 10:00.
rrrFer вне форума Ответить с цитированием
Старый 14.09.2014, 10:02   #8
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Согласен с rrrFer. Покажите свой код... Дальше видно будет.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 14.09.2014, 10:06   #9
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

что такое удалить первой слово то?
Если слово - это что-то между пробелами (судя по твоим "попыткам"), то удалить можно так (я пробелы заменил на точки, чтоб виднее было)
"..asd..fgh" -> "fgh"
или так:
"..asd..fgh" --> "..fgh"
или так:
"..asd..fgh" --> "....fgh" (удаляется только само слово, а пробелы перед ним {если были} остаются)

У челенджера ваще не обрабатывается случай, если в начале строки идет сразу пробел - видимо он как-то иначе видит удаление слов (не знаю как).

Что программа должна сделать если в строке только пробелы? Что если на вход подана вообще пустая строка?
rrrFer вне форума Ответить с цитированием
Старый 14.09.2014, 11:10   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот как я вижу решение:
Код:
char *s="Hello world";

char* find1(char *s){
 for(int i=0;s[i] && s[i]!=' ';i++);
 return s+i+1;
}

void find2(char *s){
 int i=0,j=0;
 for(;s[i] && s[i]!=' ';i++);
 for(++i;s[i];i++,j++) s[j]=s[i];
 for(;s[j];j++) s[j]=0;
}
find1 просто сместит (вернет) указатель на символ после пробела
find2 перестроит строку.
Это с потолка, не проверял.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Борьба со строками: Дана строка, состоящая из слов, разделенных пробелами и заканчивающаяся точкой. Удалить в каждом слове... (C) dykee Помощь студентам 1 18.03.2014 05:07
Дана строка. В строке удалить символ двоеточие и подсчитать количество удаленных символов.в делфи _Алексей_ Помощь студентам 3 29.04.2012 15:37
Дана строка со словами, разделёнными пробелами, в конце - точка. Удалить слово с заданным номером (Паскаль ABC) Margosham-k Помощь студентам 6 10.04.2012 12:11
Дана строка символов. Удалить из исходной строки все цифры. Striker14 Помощь студентам 4 26.02.2009 15:50
Дана строка символов. Задача: удалить из строки все цифры. Striker14 Помощь студентам 1 25.02.2009 20:23