Напечатать все слова, которые встречаются в строке только по одному разу. - C (СИ)

  1. Вот такая вот задача: Дана строка s, содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв. Между соседними словами стоит запятая, за последним словом - точка. Напечатать все слова, которые встречаются в строке только по одному разу.


textual

Код:

#include <stdio.h>
#include <string.h>
 
#define SIZE 256
#define WORDS 30
#define DELIMS ",. "
 
int main(void)
{
    char str[SIZE] = "", *ptr = NULL, *word[WORDS] = { NULL };
    size_t counter = 0, i, j, flag;
    
    if (scanf("%255[^\n]", str) == 1 && fgetc(stdin) == '\n')
    {
        for (
                ptr = strtok(str, DELIMS);
                ptr != NULL && counter < WORDS;
                ++counter, ptr = strtok(NULL, DELIMS)
            )
        {
            word[counter] = ptr;
        }
        
        for (i = 0; i < counter; ++i)
        {
            flag = 0;
            for (j = 0; j < counter; ++j)
            {
                if (i != j && strcmp(word[i], word[j]) == 0)
                {
                    flag = 1;
                    break;
                }
            }
            
            if (flag == 0)
                printf("%s\n", word[i]);
        }
    }
    
    return 0;
}


Похожие ответы
  1. Создать массив, заполнить 20 элементами, сложить и вывести на экран все кратные 3Добавлено через 4 минуты Помогите плиз

  1. Нужно воспользоваться вложенными циклами чтобы написать программу, которая выводит на печать фигуру в виде пирамида(как на скрине)http://************/966d955e33913f4aa8302760519aa5fa Фигура разворачивается в зависимости от того, какой символ был введен. Есть внешний цикл(для обработки строк) и три внутренних(1 - для пробелов, 2 - для печати букв в порядке возр., 3 - для печати букв в порядке убыв.) Вообщем не понимаю как символы которые выводятся с помощью 3 внутр. цикла шли в обратном порядке, начиная со второго ряда. А АВА АВСВА ABCDCDA ABCDEDCBAC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 void four() {     int row, probel, left_char, right_char, col;     char ch;       printf("\nVvedite symbol: ");     scanf("%c", &ch);       for (row = 1; row <= 5; row++)     {         for (probel = 4; probel >= row; probel--)             printf(" ");           for (left_char = ch - 4, col = 1; col <= row; left_char++, col++)             printf("%c", left_char);                                                       for (right_char = ch - 4, col = 1; col <= row - 1; right_char++, col++)             printf("%c", right_char);           printf("\n");       }       return; }

  1. Заполнить одномерный массив случайными числами. Вывести на экран все элементы массива, являющимся двухзначными числами. Буду благодарен)))

  1. Дан текст, содержит от 2 до 30 слов, в каждом из которых от 2 до 10 латинских букв; между соседними словами - не менее одного пробела. Написать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: 1) перенести первую букву в конец слова; 2) перенести последнюю букву в начало слова.

  1. Подскажите пожалуйста текст программы, которая печатает последнюю из самых коротких строк текстового файла. Текстовый файл рандомный.Добавлено через 3 часа 6 минут Вот, что получилось. Компилятор ругается на строку с открытием файла по заданному адресу. И еще не проработала момент с выводом именно ПОСЛЕДНЕЙ короткой строки. Подскажите, как это сделатьC1 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 #include #include #include     void main( ) { FILE *text; int length=100; char *string; if ((text = fopen("G:\IRIT-RtF\Algoritmisation\ShortStrok","r")) == NULL) { puts ("Error opening file");   exit (-1); } while(!feof(text))// пока не конец файла     {         fgets(string, 100, text);         if(strlen(string)

  1. Подскажите ошибку, которую допустила в программе. Задание такое: Вводится текст, за которым следует точка. В алфавитном порядке напечатать (по разу) все строчные русские буквы, входящие в этот текст. (требуется написать программу на языке СИ)C1 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 #include #include   int main() { char *user_input = malloc(sizeof(char)); char *output = malloc(sizeof(char)); int i = 0; int d = 0; int flag = 1; while (1) { scanf("%c", &user_input[i]); if (user_input[i] == '.') {user_input[i]='\0';break;} for (int j = 0; j < i; i++) { if (user_input[i] == output[j]) { flag = 0; break; } } if (flag) { output[d] = user_input[i]; d++; output =(char*) realloc(output, (d + 2) * sizeof(char)); } flag = 1; i++; user_input = (char*)realloc(user_input, (i + 1) * sizeof(char)); } printf("input %s",user_input); printf("output %s",output); char x; for (int m = 0; m < d; m++) { for (int j = d - 1; j > m; j--) { if (output[j - 1] > output[j]) { x = output[j - 1]; output[j - 1] = output[j]; output[j] = x; } } } output[d + 1] = '\0'; printf("%s", output); return 0; }

  1. Помогите реализовать задание: Заменить все пары букв «XY» на цифры «12», через do-while. Находил похожее, но там решения так и не было получено.

  1. В общем, я запутался. Вот задание. Необходимо разработать программу согласно варианту задания. При реализации использовать указатели на функции и (или) массивы указателей на функции. -------------------------------------------------- Дан список записей типа ТОВАР (размер списка и его элементы вводятся пользователем). Упорядочить список по любому из полей в любом направлении. Поле и направление выбирает пользователь. В функцию сортировки должен передаваться указатель на функцию сравнения двух элементов. (20 баллов). ТОВАР: - наименование товара (строка 15 символов); - единицы измерения (строка 5 символов); - цена (вещественное число с двумя знаками после запятой); - количество (целое положительное число). То, что накаляканоC1 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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 #include #include #include #include #include typedef struct {     char  name[16];     char  mesr[6];     double price;     int count; }Good; typedef Good *Ptr; typedef int (*Pfun)( void *, void * ); int cmpNM ( void *, void * ); int cmpCNT( void *, void * ); void sortbychoice( Ptr , int, size_t, void (*), Pfun ); void swap ( Ptr , Ptr ); int main( int argc, char *argv[ ] ) {     //printf( "%d",  offsetof( Good, count) );     int d = 0, count;     printf( "Enter count of lists: ");     while( !d || count <= 0)     {         d = scanf( "%d", &count );         if( !d || count <= 0 ) { while( getchar( ) != '\n' ); printf( "Repeat: "); }     }     fflush( stdin );     int i;     Ptr list = (Good*)calloc( count, sizeof(Good));     for( i = 0; i < count; i++ ) { printf( "Name|Measure|Price|Count: " ); scanf( "%s%s%lf%d", list[i].name, list[i].mesr, &list[i].price, &list[i].count ); while( getchar( ) != '\n' );}       //       //sortbychoice( list, count, sizeof(char)*15, list[i].name, cmpNM );     sortbychoice( list, count, offsetof( Good, count ), &list[i].count, cmpCNT);     for( i = 0; i < count; i ++ ) printf( "Name: %s | Measure: %s | Price: %3.2lf | Count: %03d\n", list[i].name, list[i].mesr, list[i].price, list[i].count );     system( "pause" );     getch( );     return 0; }   void swap ( Ptr arg1, Ptr arg2 ) {    Good temp = *arg1;    *arg1 = *arg2;    *arg2 = temp;    return; } int cmpNM( void * arg1, void * arg2 ) {     if( strcmp( (char*)arg1, (char*)arg2 ) == 1 ) return 1;     else return 0; } int cmpCNT( void * arg1, void *arg2 ) {     if(*((int*)arg1) > *((int*)arg2)) return 1;     else return 0; } void sortbychoice ( Ptr good, int count, size_t size, void *arr, Pfun fun  ) {      Ptr mass = good;      int i, j, im;      char * ar = ( char* )arr;      for( i = 0; i < count - 1; i++ ){         im = i;         for( j = i + 1; j < count; j++ ) if( fun( (void*)( ar + im*size),  (void*)( ar + j * size )) ) im = j;         swap( &mass[i], &mass[im] );      }      return; }Добавлено через 3 минуты дело в том, что я не могу понять, как мне обращаться к началу памяти одного и того же поля в массиве структур. Делал такое с обычными массивами, вроде всё работало. Вот как делал:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void SortArray( void *array, unsigned num, size_t size, int (*fun)(void *arg1, void *arg2), void (*fun1)( void *arg1, void *arg2)) {     int i, j;     int imin, imax;     char *ptr = (char* )array; // указатель на начало памяти массива     for( i = 0; i < num - 1; i += 2 )     {         imin = i;         for( j = i + 2; j < num; j += 2 )         if( fun( (void*)(ptr + imin*size), (void*)(ptr + j*size)) > 0 ) imin = j;                 fun1( ptr + i*size, ptr + imin*size);// смещение указателя на size бацтов массив     }  for( i = 1; i < num - 1; i += 2 )     {         imax = i;         for( j = i + 2; j < num; j += 2 )         if( fun( (void*)(ptr + imax*size), (void*)(ptr + j*size)) < 0 ) imax = j;                 fun1( ptr + i*size, ptr + imax*size );// смещение указателя на size бацтов массив     } }Добавлено через 32 минуты Сообщение от Michail97 //sortbychoice( list, count, sizeof(char)*15, list[i].name, cmpNM ); * * sortbychoice( list, count, offsetof( Good, count ), &list[i].count, cmpCNT); На эти строки на намекать. ИсправилДобавлено через 3 минуты В общем, для сортровки по кол - ву работает вроде.C1 2 3 4 5 6 7 8 9 10 11 12 void sortbychoice ( Ptr good, int count, void *arr, Pfun fun  ) {      Ptr mass = good;      int i, j, im;      char * ar = ( char * )arr; // указатель на начало памяти выбранного поля аргумента arg      for( i = 0; i < count - 1; i++ ){         im = i;         for( j = i + 1; j < count; j++ ) if( fun( (void*)( ar + im*sizeof( Good)),  (void*)( ar + j * sizeof(Good) )) ) im = j;         swap( &mass[i], &mass[im] );      }      return; }Сейчас попробую со строками также провернутьДобавлено через 9 минут В общем, пока работает. Если найдёте грабли ещё, укажите, пожалуйста. C1 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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 #include #include #include #include #include typedef struct {     char  name[16];     char  mesr[6];     double price;     int count; }Good; typedef Good *Ptr; typedef int (*Pfun)( void *, void * ); int cmpNM ( void *, void * ); int cmpCNT( void *, void * ); void sortbychoice( Ptr , int, void (*), Pfun ); // для 1 - ого аргумента необходимо передать 2 - ой указатель void swap ( Ptr , Ptr ); int main( int argc, char *argv[ ] ) {     //printf( "%d",  offsetof( Good, count) );     int d = 0, count;     printf( "Enter count of lists: ");     while( !d || count <= 0)     {         d = scanf( "%d", &count );         if( !d || count <= 0 ) { while( getchar( ) != '\n' ); printf( "Repeat: "); }     }     fflush( stdin );     int i;     Ptr list = (Good*)calloc( count, sizeof(Good));     for( i = 0; i < count; i++ ) { printf( "Name|Measure|Price|Count: " ); scanf( "%s%s%lf%d", list[i].name, list[i].mesr, &list[i].price, &list[i].count ); while( getchar( ) != '\n' );}       //       sortbychoice( list, count,list[0].name, cmpNM );     //sortbychoice( list, count, &list[0].count, cmpCNT);     for( i = 0; i < count; i ++ ) printf( "Name: %s | Measure: %s | Price: %3.2lf | Count: %03d\n", list[i].name, list[i].mesr, list[i].price, list[i].count );     system( "pause" );     getch( );     return 0; }   void swap ( Ptr arg1, Ptr arg2 ) {    Good temp = *arg1;    *arg1 = *arg2;    *arg2 = temp;    return; } int cmpNM( void * arg1, void * arg2 ) {     if( strcmp( (char*)arg1, (char*)arg2 ) == 1 ) return 1;     else return 0; } int cmpCNT( void * arg1, void *arg2 ) {     if(*((int*)arg1) > *((int*)arg2)) return 1;     else return 0; } void sortbychoice ( Ptr good, int count, void *arr, Pfun fun  ) {      Ptr mass = good;      int i, j, im;      char * ar = ( char * )arr;      for( i = 0; i < count - 1; i++ ){         im = i;         for( j = i + 1; j < count; j++ ) if( fun( (void*)( ar + im*sizeof( Good)),  (void*)( ar + j * sizeof(Good) )) ) im = j;         swap( &mass[i], &mass[im] );      }      return; }

  1. Все Работает если вводить без пробелов, но с пробелом выводится только первое число, (если можно с кратким объяснением пожалуйста)C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include #include     int main(){       char str[100];     int x = 0;     scanf("%s", str);     for(int i = 0;i < strlen(str);i++)     {         if((str[i] >= '1') && (str[i] <= '9'))         {             x += ((int)str[i] - 48);                     }     }     printf("%d", x);       return 0; }

  1. Задача вроде и понятна. но есть пару моментов. Обязательно нужно использовать функции библиотеки . Собственно я нашел совершенно подходящую функцию для поиска символа - char * strrchr( const char *string, int i). Но как ее притулить мне совершенно не понятно. Если есть другие варианты, то от них я тоже не отказываюсь. C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include #include #include #include #include int main() {     int i,n;       for(i=0;i<100;i++)     {             n=pow(i,2);         //  char * strrchr( const char *string, int i)         printf("\n%d",n);     }         getch(); }