Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.59/41: Рейтинг темы: голосов - 41, средняя оценка - 4.59
1 / 1 / 0
Регистрация: 16.10.2011
Сообщений: 45
1

Разделение строки на слова (без string.h)

26.11.2011, 20:54. Показов 7609. Ответов 22
Метки нет (Все метки)

нужно разбить строку на слова (си)
без использования библиотеки string.h (пользоваться можно только stdio.h)
можно использовать многомерные массивы

подкиньте идею как реализовать\алгоритм

заранее благодарю !
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2011, 20:54
Ответы с готовыми решениями:

Разделение строки типа String на отдельные слова с разделяющим символом
Подскажите пожалуйста, как строку с n-ым количеством слов разделённых символом точка запятой...

Как определить длину самого короткого слова из строки без библиотеки string на С++
Написать программу. Как определить длину самого короткого слова из строки без библиотеки string на...

Разделение строки на 2 подстроки с последующей записью последних в HashMap<String, String>
Дорбого времени суток. Застрял на такой глупости блок кода который читает построчно тхт файл и...

Разделение строки на слова, и поиск слова по определенным критериям
Вводиться строка, разделенная пробелами. Требуется отыскать слово, в котором гласных A,E,I,O...

22
84 / 84 / 20
Регистрация: 26.10.2009
Сообщений: 269
26.11.2011, 22:19 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include <conio.h>
#include <locale>
using namespace std;
 
int main()
{   
    char *tempSlova = new char[20]; 
    char *myString = new char[100];
    cout << "Введите строку: ";
    fflush(stdin);
    gets(myString);
 
    cout << "Слова с втроке:" << endl;
 
    for(int i = 0, k =0 ; i <= strlen(myString); i++, k ++)
    {   
        if(myString[i] == ' '|| myString[i] == '\0')
        {   
            tempSlova[k] = '\0';
            puts(tempSlova);
            
            k = -1;
        }
        else
            tempSlova[k] = myString[i];
        
    }
    getch();
    
    return 0;
}
Если нужно работать с полученными словами, тогда вместо

C++
1
puts(tempSlova);
передовай tempSlova в какую-нибудь функцию и там работай с ней.
1
Эксперт С++
4257 / 2231 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 22:23 3
ZaVyLoN. несколько замечаний:
требовалась программа на Си;
У вас используется функция strlen() из <string.h>;
разделители бывают не только пробелы;
по возможности не используйте gets() - плохая функция;
не подключен заголовочный файл <stdio.h>.
0
84 / 84 / 20
Регистрация: 26.10.2009
Сообщений: 269
26.11.2011, 22:29 4
Thinker, разве в С нельзя использовать strlen() ?
Помнню что нам поначалу препод не разрешал использовать strlen() в С. И приходилось ручками прописывать.

Цитата Сообщение от Thinker Посмотреть сообщение
разделители бывают не только пробелы.
думаю wind_mill разберется и доработает.
0
Эксперт С++
4257 / 2231 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 22:31 5
ZaVyLoN, strlen() в любом случае можно использовать (куда без нее, хорошая функция), но по условию данной задачи нельзя подключать <string.h>, а эта функция именно оттуда.
0
84 / 84 / 20
Регистрация: 26.10.2009
Сообщений: 269
26.11.2011, 22:37 6
Заметил Ваше первое(с поправкой) сообщение.
Да и длину узнать не проблема без strlen/
0
Эксперт С++
4257 / 2231 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 22:38 7
Цитата Сообщение от ZaVyLoN Посмотреть сообщение
Да и длину узнать не проблема без strlen/
никто и не спорит что сложно, просто малюсенькие замечания и все.
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.11.2011, 22:39 8
Thinker,
C
1
2
3
4
5
6
7
8
int strlen (char *s)
{
   int i;
   
   for (i=0;s[i];i++) ;
  
   return i;
}
0
Thinker
26.11.2011, 22:41
  #9

Не по теме:

go, это вы так показательно, намекая, что я бы так не написал?;)

0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.11.2011, 22:45 10
Цитата Сообщение от Thinker Посмотреть сообщение
по возможности не используйте gets() - плохая функция;
А почему плохая то?

Не по теме:

Цитата Сообщение от Thinker Посмотреть сообщение
go, это вы так показательно, намекая, что я бы так не написал?
Случайно ваш ник вставился, пост адресовался автору темы, чтобы он вставил вместо подключения заголовочного файла.
Думаю, Вы еще элегантнее сделаете ;)


Цитата Сообщение от Thinker Посмотреть сообщение
разделители бывают не только пробелы;
А какие еще?
0
Эксперт С++
4257 / 2231 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 22:50 11
Функция gets() не контролирует количество вводимых символов, например, у вас строка char s[10], а вы ввели более 9 символов, тем самым для '\0' места не найдется. Лучше fgets().

Разделители могут быть и точки, запятые и т.д. Например, у вас строка "abc. xyz.". Разве слова abc. и xyz. вас устроят?!
0
84 / 84 / 20
Регистрация: 26.10.2009
Сообщений: 269
26.11.2011, 22:50 12
Цитата Сообщение от Thinker Посмотреть сообщение
никто и не спорит что сложно, просто малюсенькие замечания и все.
Напротив, замечания и критика только в плюс.
На мелочах посторен мир))



Цитата Сообщение от go Посмотреть сообщение
Сообщение от Thinker
разделители бывают не только пробелы;
А какие еще?
Знаки препининия.
1
1 / 1 / 0
Регистрация: 16.10.2011
Сообщений: 45
26.11.2011, 22:50  [ТС] 13
идею ухватил, длину строки без string.h реализую
спасибо, друзья !
0
Каратель
Эксперт С++
6598 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.11.2011, 22:51 14
Цитата Сообщение от go Посмотреть сообщение
А почему плохая то?
если gets-ом считать больше чем размер массива то произойдет переполнение, а fgets этого не допустит

опоздал...
0
1 / 1 / 0
Регистрация: 16.10.2011
Сообщений: 45
26.11.2011, 22:52  [ТС] 15
Функция gets() не контролирует количество вводимых символов, например, у вас строка char s[10], а вы ввели более 9 символов, тем самым для '\0' места не найдется. Лучше fgets().
новая для меня информация спасибо, учту
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.11.2011, 22:57 16
Цитата Сообщение от Thinker Посмотреть сообщение
Разделители могут быть и точки, запятые и т.д.
Ну это уже если сильно углубляться, а так не красиво получатся слова через запятую (пробелы всеравно нужны)





Цитата Сообщение от Thinker Посмотреть сообщение
Функция gets() не контролирует количество вводимых символов, например, у вас строка char s[10], а вы ввели более 9 символов, тем самым для '\0' места не найдется.
Если я не ошибаюсь, есть вероятность, что все равно программа отработает корректно, нелепо конечно так делать...
Цитата Сообщение от Jupiter Посмотреть сообщение
если gets-ом считать больше чем размер массива то произойдет переполнение, а fgets этого не допустит
Так это можно писать почти в каждой ветке о символьных массива в Си, даже и со сканфом
0
Эксперт С++
4257 / 2231 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 23:04 17
go, имеется ввиду, что мы вводим множество разделителей, в котором пробел, точка и т.д., то есть несколько разделителей, если я правильно понял вас

Поэтому лучше fgets()
0
go
Эксперт С++
3643 / 1375 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
26.11.2011, 23:07 18
Thinker, теперь я вас не поянл
0
Эксперт С++
4257 / 2231 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 23:14 19
Цитата Сообщение от go Посмотреть сообщение
Thinker, теперь я вас не понял
Вы поняли, просто мы об одном разными словами говорим. Например, пусть DEL = " .,;:\t\n" - множество разделителей. Тогда слово - цепочка подряд идущих символов по первого символа из DEL. Например, если строка s = "abc,. .xyz:;", то словами будут
abc
xyz
А если DEL = " ", то слова будут такими:
abc,.
.xyz:;
2
1 / 1 / 0
Регистрация: 16.10.2011
Сообщений: 45
27.11.2011, 01:18  [ТС] 20
совсем соображалка не работает
почему программа работает не верно ?
вот код и условие задачи:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Ввести строку и слово, удалить все вхождения слова и вывести строку
 
#include <conio.h> // для getch()
#include <stdio.h>
 
void main (void)
 
{
    int LEN; // длина строки
    char *str=new char[100];  // исходная строка
    char *word=new char[100];  // исходное слово
    char *w=new char[100];
    puts("Enter string:");
    gets(str);
    puts("\nEnter word:");
    gets(w);
    puts("\n----------------------------------------");
    
    // находим длину строки
    for(int a=0; str[a]!='\0'; a++)
        LEN=a; 
    
    // делим строку на слова
    for(int i=0, k=0; i<=LEN+1; i++, k++) 
    {
        if(str[i]==' ' || str[i]=='\0') 
        {
            word[k]=='\0'; // сравниваем слова
            for (int a=0; word[a]!='\0' && w[a]!='\0'; a++) 
            {
                if (word[a] != w[a]) 
                {
                    puts(word); 
                    break;
                }
            }
            k=-1;
        }
        else
            word[k]=str[i];
        getch();
    
    }
}
Добавлено через 26 минут
передовай tempSlova в какую-нибудь функцию и там работай с ней.
можно по подробней (чайник )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.11.2011, 01:18

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Разделение строки на слова
Подскажите пожалуйста, как разделить строку на отдельные слова. Заранее спасибо.

Разделение строки на слова
Есть строка типа &quot;mov ebx+edx&quot; нужно разделить так чтобы получить массив символов: mov ebx +...

Разделение строки на слова
Текст в файле содержит числа, которые записаны в восьмеричной системе счисления. Преобразовать эти...

Разделение строки на слова
Как я знаю для разделения строки типа char* на слова по разделителю используется функция strtok,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.