Консультация № 108922
11.11.2007, 12:16
0.00 руб.
0 4 4
Как грамотно написать программу выделения слов произвольной строки. Слова отделяются друг от друга одним или несколькими пробелами (в начале и в конце строки тоже могут быть пробелы).
Интересует только написание в стиле Cи ( то есть - массив типа char)

Обсуждение

Неизвестный
11.11.2007, 12:53
общий
это ответ
Здравствуйте, Navnav!
Вт програмка для вашей задачи, разбивает предложение на слова:

Приложение:
#include<stdio.h>#include<string.h>#include<conio.h>#include<mem.h>#define MAXSTR 1024 //Максимальная длина строки#define MAXWORD 32 //Максимальное кол-во слов#define MAXSW 16 //Максимальная длина словаint main(void){ //Здесь строка прописывается непосредственно, но может быть считана например из файла char str[MAXSTR] = " Slova otdelyautsya drug ot druga odnim ili neskolkimi probelami "; char *sttm, strd[MAXWORD][MAXSW]; //Сюда будут помещены отдельные слова int i, j; //Найдём первый символ - не пробел sttm = str; while( sttm[0] == ‘ ‘ ) sttm ++; //Найдём длину строки без завершающих пробелов i = strlen( sttm ) - 1; while( sttm[i] == ‘ ‘ ) i --; sttm[i + 1] = ‘\0‘; //Разбиваем предложение на слова j = 0; do{ i = 0; while( sttm[i] != ‘ ‘ && sttm[i] != ‘\0‘ ) i ++; memcpy( strd[j], sttm, i ); strd[j][i] = ‘\0‘; sttm += i; while( sttm[0] == ‘ ‘ ) sttm ++; j ++; }while( sttm[0] != ‘\0‘ ); //Выводим массив слов на экран for( i = 0; i < j; i ++ ) printf( "%s\n", strd[i] ); getch( ); return 0;}
Неизвестный
11.11.2007, 13:04
общий
это ответ
Здравствуйте, Navnav!
Восепользуйтесь функцией strtok();
ее параметры:
1-й указатель на строку, которая будет обрабатываться!
2-й указатель на строку, которая будет содержать в себе символы ограничители!

см пример!
В примере отбрасываеться все пробелы и энтеры! можете убрать энетры и оставить только пробелы!

Приложение:
#include "iostream"#include "string.h"using namespace std;void main(void){ char str[]=" String is ALong\n This is a new string "; char seps[]=" \n"; char *word; word=strtok(str,seps); while(word!=NULL) { cout<<word<<"\n"; word=strtok(NULL,seps); } cin.get();}
Неизвестный
11.11.2007, 20:10
общий
это ответ
Здравствуйте, Navnav!
Может помочь ф-ция strtok
Пример в приложении
Подробности в MSDN
Удачи!


Приложение:
Example/* STRTOK.C: In this program, a loop uses strtok * to print all the tokens (separated by commas * or blanks) in the string named "string". */#include <string.h>#include <stdio.h>char string[] = "A string\tof ,,tokens\nand some more tokens";char seps[] = " ,\t\n";char *token;void main( void ){ printf( "%s\n\nTokens:\n", string ); /* Establish string and get the first token: */ token = strtok( string, seps ); while( token != NULL ) { /* While there are tokens in "string" */ printf( " %s\n", token ); /* Get next token: */ token = strtok( NULL, seps ); }}OutputA string of ,,tokensand some more tokensTokens: A string of tokens and some more tokens
Неизвестный
12.11.2007, 03:49
общий
это ответ
Здравствуйте, Navnav!

А что значит "выделение слов"? В приложении программа, которая выводит "выделенные" слова по слову на строке. Для краткости исходная строка задана массивом, но вы можете добавить ввод с консоли, например функцией gets(), если у вас за неё не ругают ...

(Литература: K&R п.1.5, 5.5)


Приложение:
#include <stdio.h>#define IN 1 // внутри слова#define OUT 0 // вне словаchar line[] = "This is a bare-bones version of the UNIX program wc";int main(void){int state = IN; // признак состояния, ставим "внутри слова"char *s = line; // указатель на символ в строке, ставим на начало строки while(*s) { // идем до конца строки. То же самое, что (*s != ‘\0‘) if(*s == ‘ ‘ || *s == ‘\t‘) { // ограничемся только пробелами и табуляциями. Можно добавлять знаки препинания и т.п. if(state == IN) { // обнаружили конец слова state = OUT; // изменяем признак состояния putchar(‘\n‘); // и переходим на новую строку } } else { // это печатаемый символ if(state == OUT) state = IN; // на первом символе в новом слове изменяем признак состояния putchar(*s); // печатаем символ } s++; // передвигаем указатель на следующий символ в строке } putchar(‘\n‘); getchar(); // ожидаем нажатия Enter для выхода из программы return 0;}
Форма ответа