2013-10-06 2 views
0

Итак, у меня есть массив символов, образованный словами, разделенными пробелами. Массив считывается с ввода. Я хотел бы напечатать слова, начинающиеся с гласного.Как печатать определенные части массива строк в C?

Мой код:

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

char *insertt (char dest[100], const char sou[10], int poz) { 

    int cnt=0; 

    char *fine = (char *) malloc(sizeof(char) * 3); 
    char *aux = (char *) malloc(sizeof(char) * 3); 

    strncpy(fine,dest,poz); 

    strcat(fine,sou); 

    do { 
     aux[cnt]=dest[poz]; 
     poz++; 
     cnt++; 
    } 
    while (poz<=strlen(dest)); 

    strcat(fine,aux); 
    free(aux); 

    return fine; 
    } 


int check_vowel(char s) { 
    switch (s) { 
     case 'a': 
     case 'e': 
     case 'i': 
     case 'o': 
     case 'u': 
     case 'A': 
     case 'E': 
     case 'I': 
     case 'O': 
     case 'U': 
      return 1; 
     default: return 0; 

    } 
} 

    int main (void) { 

     const char spc[]=" "; 
     char s[100]; 
     char *finale = (char *) malloc(sizeof(char) * 3); 
     int beg,len,aux; //beg - beginning; len - length; 
     int i = 0; 


     printf("s="); 
     gets(s); 


     finale = insertt(s,spc,0); //the array will start with a space 

     do { 
      if (finale[i]==' ' && check_vowel(finale[i+1])==1) { 
       beg=i+1; //set start point 
       do { //calculate length of the word that starts with a vowel 
        len++; 
       }   
       while(finale[len]!=' '); //stop if a space is found 
        printf("%.*s\n", len, finale + beg); //print the word 
      } 

     i++; 
     } 
     while (i<=strlen(finale)); //stop if we reached the end of the string 

     free(finale); 
     return 0; 


    } 

Функция check_vowel возвращает 1, если символ является гласной, в противном случае она возвращает 0. Функция insertt вставит константный символ в полукокса из в указанной позиции я использовал его для вставки пробела в начале массива.

The input: today Ollie was ill 
The output: Segmentation fault (core dumped) 
Preferred output: 
Ollie 
ill 

Я уверен, что проблема где-то в главном цикле делать-то время, но я просто не могу понять, что может быть это ... В 2 функции работают правильно. Спасибо!

+0

Как я уже говорил, 2 функции (insertt и проверить гласный) работают правильно, они делают именно то, что они должен был делать :) –

+0

Не было бы легче читать ввод в массив строк? – LihO

+0

работает для меня: jrenner @ pc: ~ $./ test s = сегодня Ollie был болен Ollie ill – talloaktrees

ответ

1

В вашей программе много ошибок, которые могут вызвать SIGSEGV.

1) fine & aux указатели в функции insertt не были выделены с достаточным объемом памяти. Изменить сказать:

char *fine = malloc(sizeof(char) * 300); 

2) Во внешнем do while{} цикле, условие должно быть:

i<strlen(finale) 

3) Во внутреннем do while{}, условие должно быть:

while(len<strlen(finale) && finale[len]!=' '); 

EDIT

Существует еще в вашем коде logical error, который я оставляю вам, чтобы понять это:

Для строки:

adfajf isafdadsf ifsfd 

Ваш выход был:

adfajf 
isafdadsf ifsfd 
ifsfd 

что неправильно! !

+0

Пожалуйста, не предлагайте отличать возвращаемое значение 'malloc()', даже если код OP содержит эту ошибку. –

+0

@ H2CO3 отредактирован соответствующим образом .. :) – nitish712

+0

Спасибо, отлично! –

0

Альтернативный подход, используя небольшой конечный автомат. Строка изменена на месте. Стратегическое использование break и continue позволяет избежать многих условностей. (единственный оставшееся условие его для добавления пространства перед второй и последующими выбранными словами)

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

int classify(int ch) 
{ 
switch(ch) { 
case 'a': case 'A': 
case 'e': case 'E': 
case 'i': case 'I': 
case 'o': case 'O': 
case 'u': case 'U': 
case 'y':case 'Y': 
     return 1; 
case ' ': case '\t': case '\n': 
     return 0; 
default: 
     return 2; 
     } 
} 

size_t klinkers_only(char *str) 
{ 
size_t src,dst; 
int type,state; 

for (state=0, src=dst=0; str[src] ; src++) { 
     type = classify(str[src]); 
     switch(state) { 
     case 0: /* initial */ 
       if (type == 1) { state =1; if (dst>0) str[dst++] = ' '; break; } 
       if (type == 2) { state =2; } 
       continue; 
     case 1: /* in vowel word */ 
       if (type == 0) { state=0; continue; } 
       break; 
     case 2: /* in suppressed word */ 
       if (type == 0) { state=0; } 
       continue; 
       } 
     str[dst++] = str[src]; 
     } 

str[dst] = 0; 
return dst; 
} 
int main(void) 
{ 
size_t len; 
char string[] = "abc def gh ijk lmn opq rst uvw xyz"; 

printf("String:='%s'\n", string); 

len = klinkers_only(string); 
printf("Return= %zu, String:='%s'\n", len, string); 

return 0; 
} 
Смежные вопросы