Проверка знака пунктуации и проставление пробела за ним - C (СИ)

  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 #include <stdio.h> #include <ctype.h>   int main(){     FILE* f=fopen("1.txt", "wt");     char txt[BUFSIZ]={'\0'}, *a=txt,buf[100];         printf("Vvedite stroky dlya faila:\n>>");     fgets(buf,100,stdin);     fputs(buf,f);     fclose(f);       if((f=fopen("1.txt","rt"))==NULL)     {printf("FILE NOT OPEN!\n"); return 0;}       while(!feof(f)){         *a=fgetc(f);         if(ispunct(*a) && *(a+1)!=' ') *++a=' ';//возвращает ненулевое значение, если аргумент a является знаком пунктуации         a++;     }     *--a='\0';       fclose(f);     freopen("2.txt", "w", f);     fputs(txt, f);     fclose(f);     return 0; }


textual

Код к задаче: «Проверка знака пунктуации и проставление пробела за ним - C (СИ)»

#include <stdbool.h>
#include <stdio.h>
 
int main()
{
    FILE* input;
    FILE* output;
 
    int c;
    bool was_punct = false;
 
    if( (input = fopen("1.txt", "r")) && (output = fopen("2.txt", "w")) ) {
        while( (c = fgetc(input)) != EOF ) {
            if( was_punct ) {
                if( c != (int)' ' && c != (int)'\n' ) fputc(' ', output);
                was_punct = false;
            } else {
                was_punct = ispunct(c);
            }
            fputc(c, output);
        }
        fclose(input);
        fclose(output);
    }
 
    return 0;
}

СДЕЛАЙТЕ РЕПОСТ

8   голосов, оценка 4.000 из 5



Похожие ответы
  1. в borland С нужно осуществить проверку на ввод, пользователь дожлен ввести число, как проверить ввел позльзователь число или что то другое

  1. Необходимо ввести число в диапазоне от 1 до 8. Правильность ввода числа типа int уже проверена, но как проверить, входит ли введенное число в диапазон? C1 2 3 4 5 6 7 8     printf ("\nВведи положение  -> ");         do         {         res_x=scanf ("%d", &x);             fflush(stdin);             if (res_x!=1) printf("Неправильный ввод, вводи цифры! -> ");                                                }         while (res_x!=1);

  1. Как я понимаю: использовать scanf + массив для проверки на корректность ввода - неудачная идея. Она не чистит буфер, который предоставляет stdio ( ни совсем понимаю чего там происходит )).C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include   int main(void){       int n;   // Вариант с выходом из программы - все работает     printf("Введите значение: ");     if ( (scanf("%d",&n) ) != 1 ){         printf("Неверное введенное значение");         return 1;     }   // проверка с использованием цикла - зацикливает       printf("Введите значение: ");     while ( (scanf("%d",&n) ) != 1 )         printf("Неверное введенное значение, попробуйте еще: ");     printf("Успех!"); }Неужели единственный способ корректной проверки, это использовать функции read или getс, посимвольно считывать в массив, и потом уже проверять ??

  1. http://cppstudio.com/post/276/ по данной таблице пытаюсь сделать проверку на русские символы, но почему-то они не отображаются. Ввод-вывод в задание нормально, а проверку в условии if в ф-ции char* zadanie2() не проходят. С латиницей всё ок. В чём может быть дело? Убил полвечера( C1 if ((*first > 64 && *first < 91) || (*first > 96 && *first < 123) ||  //кириллица         (*first > 127 && *first < 176) || (*first > 223 && *first < 244))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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 #include #include #include #include #include   int line(); int coloumn(); float *vvod(int, int); float *zadanie1(float *,int , int); void vivod(float *,int, int); char* zadanie2();   int main() {       SetConsoleCP(1251);// отображение кириллицы в консоли для ввода и вывода, в консоли нужно выбрать свойства-> шрифт-> поставить Lusida console     SetConsoleOutputCP(1251);       float *mas=0;     char *mas2=0;     int l=0, c=0;     int switcher = 1, switcher2 = 1, a, s; //переключатели     int b=0, u=0; // проверка условия     setlocale(LC_ALL, "Russian");     while (switcher != 0)     {         system("cls");         printf("1:Ввод массива \n2:Выполнить задание 1 \n3:Вывод массива \n4:Выполнить задание 2\n5:Выход\n\n\tВведите значение:  ");         scanf_s("%d", &a);         switcher2 = 1;         switch (a)         {             case 1:             {                 getchar();                 system("cls");                 l = line();                 c = coloumn();                 mas = vvod(l, c);                 b = 1;             break;             }             case 2:             {                 if (b == 0) {                     printf("\n\tМассив не введён!\n\n");                     system("pause");                     break;             }                 system("cls");                 mas = zadanie1(mas, l, c);                 getchar();                 getchar();                 system("cls");                 break;             }             case 3:             {                 while (switcher2 != 0)                 {                 system("cls");                 printf("1:Вывод массива\n2:Вывод строки\n3:Выход в меню\n\n\tВведите значение:  ");                 scanf("%d", &s);                 switch (s)                 {                     case 1:                     {                         if (b == 0) {                             printf("\tУкажите массив\n\n");                             system("pause");                             break;                         }                         vivod (mas, l, c);                         getchar();                         getchar();                         break;                     }                     case 2:                     {                     if (u == 0) {                         printf("\n\tВведите строку\n\n");                         system("pause");                         break;                     }                     printf("\n\t%s", mas2);                     getchar();                     getchar();                     break;                     }                     case 3:                     {                         switcher2 = 0;                         break;                     }                     default:                     {                     printf("\nНеверный ввод!");                     getchar();                     getchar();                     system("cls");                     }                 }                 }                 break;             }             case 4:             {                 system("cls");                 getchar ();                 mas2 = zadanie2();                 getchar();                 u = 1;                 break;             }             case 5:             {                 switcher = 0;                 break;             }             default:             {                 printf("\nНеверный ввод!");                 getchar();                 getchar();                 system("cls");             }         }     }     return 0; }   int line() {     int l;     printf("Количество строк: ");     scanf_s("%d", &l);     return l; }   int coloumn() {     int c;     printf("Количество столбцов: ");     scanf_s("%d", &c);     return c; }   float *vvod(int x, int y) {     float *mas=0;     int i, j, l = x, c = y;     mas = (float*)malloc(l*c*sizeof(float));     for (i = 0; i= 0)// z == 0 -> строка изменится только 1 раз                   for (j = 0; j < c; j++) {                     *(mas + (i-1)*c + j) *= -1;                 z = 1;                 }         }     }     printf("\n\nПреобразованный масcив:");     vivod(mas, l, c);     return mas; }   char* zadanie2() {     char *first, *last, *ptr;     static char *str;     int n, a=0, i = 0, count = 0, len = 0, flag;     do {     printf("Введите максимальную длину строки: ");     scanf("%d", &n);} while (n < 5);     str = (char *)malloc(n*sizeof(char));     fflush(stdin);// очистка входного потока     printf("Введите исхолную строку: ");     fgets(str, n, stdin);     while(str[i]){         if(str[i] != ' ' && str[i] != '\n')             len++;         else{             if(str[i - 1] != ' '){             for(last = &str[i - 1], ptr = first = last - len + 1, flag = 0; first < last; first++, last--){                 if(*last != *first){                     flag = 1;                     break;                 }             }             if(!flag && len > 1){                 first = ptr;                 a = 0;                 while(*first != ' ' && *first != '\n') {                 if ((*first > 64 && *first < 91) || (*first > 96 && *first < 123) || (*first > 127 && *first < 176) || (*first > 223 && *first < 244))//ЭТО ЗДЕСЬ!                     a++;                 *first++;                 }                 first = ptr;                 if (len == a){                 while(*first != ' ' && *first != '\n')                     putchar(*first++);//выводит посимвольно строку с адресом first, последовательно увеличивая счёчик вывода                 count++;                 putchar('\n');                 }             }             len = 0;             }             }         i++;         if (str[0] == '\n')             count = 0;     }     printf("Total %d words.\n", count);       return str; }

  1. Всем привет! Снова вопрос, как можно реализовать следующую вещь: Допустим я ввожу какой либо символ из 3 (в моем случае F,C или K) и перед ним цифру. 1 цель: Если буква отличается от F,C или K, (например введу 42G) то он выдает мне "G is not a valid temperature type. Ending program." 2 цель: Если я ввожу не просто цифры и всего лишь одну букву, а ввожу например целое слово (например 420 Blaze), то он выдает "Invalid formatting. Ending program." Мои небольшие старания (необходимая часть программы) в ней только 2 цель реализована:C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 void temperature() {     float numerial = 0;     char FirstChoiceTemp = 'o';         printf("Enter the temperature followed by its suffix (F, C, or K): ");     scanf(" %f %c",&numerial,&FirstChoiceTemp);         if( (FirstChoiceTemp == 'K') || (FirstChoiceTemp == 'k') ){         Kelvin(numerial);               //вызываем функцию и передаем значение     }     else if( (FirstChoiceTemp == 'C') || (FirstChoiceTemp == 'c') ){         Celsii(numerial);     }     else if( (FirstChoiceTemp == 'F') || (FirstChoiceTemp == 'f') ){         Farenheit(numerial);     }     else {         printf("Invalid formatting. Ending program.");     }     }В ней реализована только 2 цель, и если я введу 42 G, он не выведет мне ""G is not a valid temperature type. Ending program." Может стоит еще один else if добавить? Хоть я пытался что,то выкрутить с помощью этого, не вышло

  1. Доброго времени суток, дамы и господа! Может-ли кто-нибудь подсказать в какую сторону мне копать? Я новичок. И так, задание. Реализовать проверку валидности карт по вводу 15-16-ти значного номера за алгоритмом луна для AMEX, MasterCard и Visa. Т.е. пользователь вводит номер, а ему пишут чья это карта и валидна-ли она за этим алгоритмом. В обшем, т.к. я новичок, то я просто не знаю с чего мне начать. Подскажите, а?

  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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #include #include #include #include int main() { system ("chcp 1251");  system ("cls");  int a[10][10],n,m,i,j,x,y;                  printf("введите количество строк от 1 до 10\n");  scanf("%d",&n);  while(n<1||n>10)  {printf("введено неверное значение, пробуй еще\n");           scanf("%d",&n);  }  printf("введите количество элементов строки (столбцов) от 1 до 10\n");  scanf("%d",&m);  while(m<1||m>10)  {printf("введено неверное значение, пробуй еще\n");   scanf("%d",&m);  } srand(time(0));  for(i=0;iabs(max))       {max=a[i][j];       i_max=i;       j_max=j;       }     } y=-a[i_max][j_max]; x=a[i_max][j_max]; a[i_max][j_max]=y; y=x; }   printf("\преобразованная матрица\n"); for(i=0;i

  1. Проблема такая. В библиотеке была создана глобальная переменная(extern int key. Чтобы можно было ей пользоваться, на сколько я понял, требуется в любом .c файле проинициализировать её (int key = a. А условие такое, что в main нельзя её инициализировать и требуется написать функцию int generation() которая будет возвращать ++key. Можно ли где-нибудь в другом месте её проинициализировать или проверить, случалось ли это ранее?

  1. Необходимо проверить один массив на наличие другого в нём. То есть проверить есть ли в массиве А элементы массива B и вывести их на экран. Элементы не обязательно должны быть с одинаковыми индексами. Вот мой код. На строке if (A[i] == B[j]) программа вылетает и выдает ошибку: Вызвано исключение: нарушение доступа для чтения. B было 0xE14000.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 #include "stdafx.h" #include "stdio.h" #include #include #include   int main() {     setlocale(LC_ALL, "RUS");     int B[] = { 23470 };     const int n=10;     int A[n];     int i = 1, j, N;       //создание и ввод массива     printf("Введите символы массива А   \n");     for (i = 0; i < n; i++)     {         scanf_s("%d", &A[i]);     }       //вывод цифр     printf("Цифры:    ");     for (i = 0; i < n; i++)     {         for (j = 0; i < n; j++)         {             if (A[i] == B[j])                 printf("%d", A[n]);         }     }       system("pause");     return 0; }

  1. Добрый вечер. Я вас уже стал слишком часто беспокоить, хорошо, однако, кой-какие недостатки исправляю сам. Есть программа, которая работает: она ищет один единственный элемент в матрице, который противоположного знака, чем все остальные. Это значит, что если в матрице NxM все элементы положительные, и один единственный отрицательный (нулей нет, они исключены), то ответ будет: Отрицательный. И наоборот. Но это работает, когда вводимые N и M соответственно небольшие. Когда я ввожу 100000000000000000 и 100000000000000000 (или даже чуть меньшее число), то пишет:C1 Segmentation fault (core dumped)Однако, я выделил память под Long Long. Где ошибка? Вот код: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 #include #include   int main() {     long long i, j, eilute, stulpelis, elementas;     int skaitliukas_teigiamu = 0;     int skaitliukas_neigiamu = 0;         scanf ("%lld %lld", &eilute, &stulpelis);           long long **array = (long long **) malloc(eilute * sizeof(long long *));         for(i = 0; i < eilute; i++) {             array[i] = (long long *) malloc(stulpelis * sizeof(long long));         }       for(i = 0; i < eilute; i++) {         for(j = 0; j < stulpelis; j++) {             scanf("%lld", &elementas);                 if (elementas > 0) {                     skaitliukas_teigiamu++;                 }                 if (elementas < 0) {                     skaitliukas_neigiamu++;                 }         }     }       if (skaitliukas_teigiamu > skaitliukas_neigiamu) {         printf("Neigiamas\n");     }       if (skaitliukas_neigiamu > skaitliukas_teigiamu) {         printf("Teigiamas\n");     } // free(array); return 0; }