Вывод, передача и хранение строк - C (СИ)

  1. Собственно, вопрос следующий: Необходимо считать строку и изменить её. Проделать это с N строками. Затем вывести результат изменения всех строк. Грубо говоря, мы узнаём у пользователя сколько строк будет вводиться, считываем поочерёдно строки, параллельно изменяя их определённым образом, а затем у меня загвоздка: не знаю, как лучше поступить... Наверное, куда-то и как-то сохранить. Но как создать нужное кол-во массивов типа char с разными именами под изменённые строки - не знаю. Подскажите, пожалуйста. Обрыл весь форум... Прикладываю код.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 #include<stdio.h> #include<conio.h> #include<string.h>   int main() {    int ai,a;    char str0[BUFSIZ];    printf("Input number of strings: ");    scanf("%d",&a);    for(ai=0;ai<a;ai++)    {     fflush(stdin);     char str[BUFSIZ]; int size,l;     printf("\n");     gets(str);     fflush(stdin);     size=strlen(str)+1;     int second_words_lenght=0,first_space=0,k;     for(k=0;k<size;k++)     {         if (str[k]==' ')         {             if (first_space==0)             {                 first_space=k;             }             else //определяем длину второго слова (начиная от второго пробела и заканчивая символом после первого пробела(справа налево))             {                 if (second_words_lenght==0)                 {                     second_words_lenght=k-first_space;                 }             }         }     }     for (k=0;k<second_words_lenght;k++)     {         char tmp=str[first_space];         for (l=first_space;l<size-2;l++)         {             str[l]=str[l+1];         }         str[size-2]=tmp;     }     int g;     for (g=0;g<=size+1;g++)     {         str0[g]=str[g];     }    puts(str);    }     return(0); }Добавлено через 2 минуты Не в той теме разместил. Поздно заметил. Прошу прощения!


textual

Код к задаче: «Вывод, передача и хранение строк - C (СИ)»

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
#define MAX_STR 20 // максимальное количество строк
#define LENGTH 100 // максимальная длина строки
 
int main() {
 
    size_t count; // вводим количество строк
    printf( "Введите количество строк " );
    scanf( "%lu", &count );
 
    // убираем символ новой строки, оставшийся после считывания числа из потока ввода
    while ( getchar() != '\n' )
        ;
 
    // это и есть массив строк, в который будем будем сохранять введённые пользователем строки
    char arrStr[ MAX_STR ][ LENGTH ]; // arrStr[ 0 ] - это первая строка в массиве, arrStr[ 1 ] - вторая и т.д.
 
    size_t i;
    for ( i = 0; i < count; ++i ) { // в цикле
        gets( arrStr[ i ] ); // считываем очередную строку, введённую пользователем
        // меняем сразу же после ввода строку номер i - первый символ строки (с индексом 0 который)
        arrStr[ i ][ 0 ] = toupper( arrStr[ i ][ 0 ] ); // приводим к верхнему регистру
    }
 
    puts( "" );
 
    // выводим изменённые строки
    for ( i = 0; i < count; ++i ) {
        puts( arrStr[ i ] );
    }
 
    return 0;
}

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

6   голосов, оценка 4.167 из 5



Похожие ответы
  1. Правильно ли я передаю arg в функцию listInsert? Нет возможности проверить. Ниже структура и фунция встаки аргумента.C1 2 3 4 5 double complex arg; scanf("%d", &re); scanf("%d", &im); arg=re+im*I; listInsert(&list, pos - 1, arg);Функции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 void listInsert(List *list, const int index, const LIST_TYPE value) {     int prev, nextHole;       if (list->_size == list->_capacity)     {         printf("Ошибка. Список полон\n");           return;     }       if (list->_size)     {         if (index < 0 || index > list->_size)         {             printf("Ошибка. Позиция не найдена\n");               return;         }     }     else if (index != 0)     {         printf("Ошибка. Позиция не найдена\n");           return;     }       nextHole = list->_arr[list->_hole]._next;       if (index == 0)     {         list->_arr[list->_hole]._next = list->_first;         list->_first = list->_hole;     }     else     {         prev = findPrev(list, index);         list->_arr[list->_hole]._next = list->_arr[prev]._next;         list->_arr[prev]._next = list->_hole;     }       list->_arr[list->_hole]._data = value;     list->_hole = nextHole;     list->_size++;       printf("Элемент %g%+gi вставлен в список\n", creal(arg), cimag(arg));            int findPrev(List *list, const int index) {     int i, prev = list->_first;       if (index == 0)         return END;       for (i = 0; i < index - 1; i++)         prev = list->_arr[prev]._next;       return prev; } } СтруктураC1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 typedef double complex LIST_TYPE; typedef struct _Item {     LIST_TYPE _data;     int _next;     int _prev; } Item;   typedef struct _List {     Item *_arr;     int _first;     int _hole;     int _capacity;     int _size; } List;

  1. Когда захожу в функцию PrintNeravenstvo, то указатель правильный, как только я делаю один заход на строчку( нажимаю ф10 один раз), то указатель меняется, и почему-то указывает на i. Сперва я создаю массив в функции uravnenie_ploskosti, потом его возвращаю в функцию convex_hull, а после передаю этот указатель в функцию PrintNeravenstvo, где у меня и образовался косяк. Вот код: 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 int* uravnenie_ploskosti(vertex *p1, vertex *p2, vertex *p3) {     int i;     vertex *p;     int matr[K][K];     int uravnenie[M];       for (i = 0, p = p1; i < K; i++)     {         if (i == 1) p = p2;         if (i == 2) p = p3;         matr[i][0] = 1;         matr[i][1] = p->y;         matr[i][2] = p->z;     }     uravnenie[0] = matr[0][0] * matr[1][1] * matr[2][2] + matr[0][1] * matr[1][2] * matr[2][0] + matr[0][2] * matr[1][0] * matr[2][1] - matr[0][2] * matr[1][1] * matr[2][0] - matr[0][0] * matr[1][2] * matr[2][1] - matr[0][1] * matr[1][0] * matr[2][2];       for (i = 0, p = p1; i < K; i++)     {         if (i == 1) p = p2;         if (i == 2) p = p3;         matr[i][1] = 1;         matr[i][0] = p->x;         matr[i][2] = p->z;     }     uravnenie[1] = matr[0][0] * matr[1][1] * matr[2][2] + matr[0][1] * matr[1][2] * matr[2][0] + matr[0][2] * matr[1][0] * matr[2][1] - matr[0][2] * matr[1][1] * matr[2][0] - matr[0][0] * matr[1][2] * matr[2][1] - matr[0][1] * matr[1][0] * matr[2][2];       for (i = 0, p = p1; i < K; i++)     {         if (i == 1) p = p2;         if (i == 2) p = p3;         matr[i][2] = 1;         matr[i][0] = p->x;         matr[i][1] = p->y;     }     uravnenie[2] = matr[0][0] * matr[1][1] * matr[2][2] + matr[0][1] * matr[1][2] * matr[2][0] + matr[0][2] * matr[1][0] * matr[2][1] - matr[0][2] * matr[1][1] * matr[2][0] - matr[0][0] * matr[1][2] * matr[2][1] - matr[0][1] * matr[1][0] * matr[2][2];       for (i = 0, p = p1; i < K; i++)     {         if (i == 1) p = p2;         if (i == 2) p = p3;         matr[i][0] = p->x;         matr[i][1] = p->y;         matr[i][2] = p->z;     }     uravnenie[3] = -(matr[0][0] * matr[1][1] * matr[2][2] + matr[0][1] * matr[1][2] * matr[2][0] + matr[0][2] * matr[1][0] * matr[2][1] - matr[0][2] * matr[1][1] * matr[2][0] - matr[0][0] * matr[1][2] * matr[2][1] - matr[0][1] * matr[1][0] * matr[2][2]);     if (uravnenie[0] == 0 && uravnenie[1] == 0 && uravnenie[2] == 0)     {         printf("Вершины %c,%c,%c лежат на одной прямой\n", p1->name, p2->name, p3->name);         return NULL;     }     printf("Уравнение плоскости по точкам %c,%c,%C : %d*x+%d*y+%d*z+%d = 0\n", p1->name, p2->name, p3->name, uravnenie[0], uravnenie[1], uravnenie[2], uravnenie[3]);     return uravnenie; }   void PrintNeravenstvo (int *a) {     int i = 0;     for (i = 0; i < M; i++)     {         if (i == 0 && *(a + i) != 0)         {             printf("%d*x", *(a + i));             continue;         }           if (i == 1 && *(a + i) > 0) printf("+%d*y", *(a + i));         if (i == 1 && *(a + i) < 0) printf("%d*y", *(a + i));         if (i == 2 && *(a + i) > 0) printf("+%d*z", *(a + i));         if (i == 2 && *(a + i) < 0) printf("%d*z", *(a+ i));         if (i == 3) printf("<=%d", *(a + i));     }     printf("\n"); }   void convex_hull( char *f) {     FILE *file;     int n, i, j, k, x, y, z, boolean;     int *p;     vertex *p1, *p2, *p3;     file = fopen(f, "r");       if (file == NULL)     {         printf("Не удается открыть файл vertex.txt");         return;     }       n = getc(file) - 48;       for (i = 0; i < n; i++)     {         fscanf(file, "%d%d%d", &x, &y, &z);         push(x, y, z, 65 + i);     }       fclose(file);       for (p1 = First; p1->next->next!=NULL; p1=p1->next)         for (p2 = p1 -> next; p2->next != NULL; p2 = p2->next)             for (p3 = p2->next; p3 != NULL; p3 = p3->next)             {                 p = uravnenie_ploskosti(p1, p2, p3);                 if (p == NULL) continue;                 if (n == 4)                 {                     PrintNeravenstvo(p);                 }             } }

  1. Я плохо засвоил тему об указателях, и теперь мучаюсь. В мейне надо ввести какую нибуть строку(char[]), потом вызвать некую функцию в которую надо передать ету стркоку, в етой функции строку надо будет использовать в strcmp. как ето сделать. если можно, киньте простой пример, с вызовом ф-ции и ее описанием, дальше сам разберусь.

  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 #define _CRT_SECURE_NO_WARNINGS #define SIZE_OF_AREA 10 #include   enum type_Of_Cells {EMPTY = 0, SHIP, NEIGHBOR, BEATEN};   void print_Area(const enum type_Of_Cells Area[SIZE_OF_AREA][SIZE_OF_AREA], const size_t Size_Of_Area);   int main() {       enum type_Of_Cells area_For_Player1[SIZE_OF_AREA][SIZE_OF_AREA] = { EMPTY };       print_Area(area_For_Player1, SIZE_OF_AREA);       return 0; }   void print_Area(const enum type_Of_Cells Area[SIZE_OF_AREA][SIZE_OF_AREA], const size_t Size_Of_Area) {     //Why is it wrong? void print_Area(const enum type_Of_Cells **Area, const size_t Size_Of_Area)     printf("%s", "  1 2 3 4 5 6 7 8 9 10\n");     for (size_t i = 0, s = 'A'; i < Size_Of_Area; i++, s++) {         printf("%c ", s);         for (size_t j = 0; j < Size_Of_Area; j++) {             if (EMPTY == Area[i][j]) {                 printf("%s", " ");             }             if (SHIP == Area[i][j]) {                 printf("%s", "*");             }             if (NEIGHBOR == Area[i][j]) {                 printf("%s", ".");             }         }         puts("");     } }Понял, что опять что-то не понял с указателями. Всем доброго времени суток, нужна помощь. Вроде как понятно, что имя массива - это указатель на первый элемент массива. Однако, при передаче двумерного массива, таким образом C1 void print_Area(const enum type_Of_Cells **Area, const size_t Size_Of_Area)в функцию, вместо данных по этому адресу приходит пустота, хотя это тот же адрес, что и в вызывающей функции. Если кто-то понимает, что не так, поясните, пожалуйста.

  1. Всем доброго времени суток. Есть указатель на charC1 char *v_Ptr; //указательНужно передать его в функцию : C1 void testing(char *word) Как это сделать?

  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 #include   int printmas (int intmas[3][4]) {    for(int i=0; i<3; i++)      {      for(int j=0; j<4; j++)        {          printf("%d ", intmas[i][j]);        }      printf("\n");    }   return 0; }   int main ()   {     int danmassiv [3][4]={{10,9,98,65},                           {8,-9,-4,6},                           {15,6,78,-8}};       printmas(danmassiv);   }

  1. Всем привет! Собственно сабж. Я почитал о том, как это делать, но слишком много случаев показано именно для c++ и без вывода этого массива на экран. (т.к. я новичок, извините если пример именно такого типа уже разжёвывали) Программа должна создавать двумерный массив заданной размерности и в дальнейшем принять от пользователя значения для каждой ячейки. Потом должна происходить передача двумерного массива в функцию с помощью указателя и выводить на экран вбитые значения массива. Я сделал так: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   int f1(int **b,int x,int y,int i, int j) {     for (i=0;i

  1. Как передать в подпрограмму имя файла? C1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 int main() {           ask(1.txt);           return 0; }   void ask(char name ) {     cout << "ТЕСТ: УМЕЕШЬ ЛИ ТЫ РАДОВАТЬСЯ ЖИЗНИ ?" << endl;       FILE *fp;     char str[128];     if ((name , "r")  ==NULL) {     printf("Cannot open file.\n");     system("pause");     exit (1);     }     while(!feof (fp)) {     if (fgets(str, 126, fp))     printf("%s", str);     }     fclose(fp);     }Так не выводит пишет Ошибка 1 error C2059: синтаксическая ошибка: неправильный суффикс для числа Ошибка 2 error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "txt" Ошибка 3 error C2660: ask: функция не принимает 1 аргументов c:\users\витор\documents\visual studio Ошибка 4 error C2059: синтаксическая ошибка: ) 5 : требуется круглая скобка ")" для этой строчки: ask(1.txt);

  1. Здравствуйте. Пишу аналог функции strtok. Начал на с++ и написал код: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 char *mstrtok(char * &str1, const char *str2) {     char *str3;         if (str1 == NULL)         return NULL;         while (*str1 != '\0' && *str1 == *str2)         str1++;         str3 = str1;       while (*str1 != '\0' && *str1 != *str2)         str1++;         if (*str1 != '\0')     {               str1 = str1++;         str1[-1] = 0;           }     else     {         str1 = NULL;            }       return str3; }Потом решил, всё это дело переписать на Си, но возникла проблема, вот этот параметр: C++1 char * &str1 компилятор Си отказывается принимать, подскажите, пожалуйста, как это дело уладить. p.s. str1 должна сохранять все изменения которые она претерпела в функции. Приведенный выше код полностью рабочий на C++. То что mstrtok не совсем strtok, на это внимание можете не обращать. Заранее спасибо за ответы.