Использовать указатели вместо ссылок - C (СИ)

Узнай цену своей работы

Формулировка задачи:

там надо указатели вместо ссылок использовать вроде, но у меня не получилось сделать для си, уже не работает голова, а сделать надо, на с++ работает верно, в задача вводим массив слов и вызываем функцию которая во второй массив заносит все повторяющиесчя слова
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
 
void newarray(char** &arrw1,int &razm,char** &arrw2);

int main()
{
 char** a=0;char** b;char s[100]; int i,n=0;
 
 printf("skolko slov hotite vvesti?");
 scanf("%d",&n);
 
 a=(char**)malloc(sizeof(char*)*n);
 
 for(i=0;i<n;i++)
 {
  printf("\nslovo%d ",i+1);
  scanf("%s",&s);
  *(a+i)=(char*)malloc(sizeof(char)*(strlen(s)+1));
  strcpy(*(a+i),s);
 }
 
 newarray(a,n,b);
 
 for(i=0;i<n;i++)
 printf("\n%s",b[i]);
 
   system("PAUSE");
   return EXIT_SUCCESS;
}
 
void newarray(char** &arrw1,int &razm,char** &arrw2)
{
 int m=0,i,j;
 
 arrw2=(char**)malloc(sizeof(char*)*razm);
 
 for(i=0;i<razm-1;i++)
 {
  for(j=i+1;j<razm;j++)
 
  if(!(strcmp(arrw1[i],arrw1[j])))
  {
   *(arrw2+m)=(char*)malloc(sizeof(char)*(strlen(arrw1[j])+1));
   strcpy(arrw2[m],arrw1[j]);
   m++;
   
   break;
  }
      /*if(k)
      {
       *(arrw2+m)=(char*)malloc(sizeof(char)*(strlen(arrw1[i])+1));
       strcpy(arrw2[m],arrw1[i]);
       m++;
       k=0;
      }*/
 
 }
 razm=m+1;
}

Решение задачи: «Использовать указатели вместо ссылок»

textual
Листинг программы
#include <iostream>  // эту строку удалить
#include <stdlib.h>
#include <string.h>
using namespace std;  // эту строку удалить
 
void newarray(char** &arrw1,int &razm,char** &arrw2); // при объявлении прототипов, необязательно писать
                                                      // имена всех переменных. Также тут не требуются символы амперсандов
 
int main()
{
    char** a=0;  // оба указателя можно объявить в одной строке 
                 //и необязательно присваивать ему ноль (в этом случае)
    char** b;
    char s[100];
    int i, n=0;
 
 
    printf("skolko slov hotite vvesti?");
    scanf("%d",&n);
 
    a=(char**)malloc(sizeof(char*)*n); // не нужно писать (char**). 
                                       //В Си, в отличие от C++ приведение типов происходит автоматически
 
    for(i=0; i<n; i++)
    {
        printf("\nslovo%d ",i+1);
        scanf("%s",&s); // перед именем массива не пишут символ амперсанда. s - сам по себе указатель
        *(a+i)=(char*)malloc(sizeof(char)*(strlen(s)+1)); // *(a+i) лучше заменить на a[i]. Будет более читабельно
                                                          // Также не нужно явно приводить тип (char*).
                                                          // Не нужно писать sizeof(char), потому что char итак
                                                          // всегда занимает 1 байт
        strcpy(*(a+i),s); // *(a+i) лучше поменять на a[i]
    }
 
    newarray(a,n,b);
 
    for(i=0; i<n; i++)       // Тут цикл проделывает лишнее количество повторений
        printf("\n%s",b[i]);
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
void newarray(char** &arrw1,int &razm,char** &arrw2) // символы амперсанда не требуются
{
    int m=0,i,j;
 
    arrw2=(char**)malloc(sizeof(char*)*razm); // эту строку нужно вписать перед вызовом функции
 
    for(i=0; i<razm-1; i++)
    {
        for(j=i+1; j<razm; j++)
 
            if(!(strcmp(arrw1[i],arrw1[j])))
            {
                *(arrw2+m)=(char*)malloc(sizeof(char)*(strlen(arrw1[j])+1)); //строку можно упростить
                strcpy(arrw2[m],arrw1[j]);
                m++;
 
                break;
            }
        /*if(k)
        {
         *(arrw2+m)=(char*)malloc(sizeof(char)*(strlen(arrw1[i])+1));
         strcpy(arrw2[m],arrw1[i]);
         m++;
         k=0;
        }*/
 
    }
    razm=m+1; // это вообще непонятно для чего
}

Объяснение кода листинга программы

  1. Программа создает массив слов из ввода пользователя и сохраняет его в двухмерном массиве.
  2. Ввод количества слов осуществляется с помощью функции scanf().
  3. Для каждого введенного слова выделяется память с помощью функции malloc() и сохраняется указатель на это слово в массиве.
  4. В конце программы вызывается функция newarray(), которая создает новый массив, используя старый массив, и сохраняет его в переменной arrw2.
  5. Затем программа выводит новый массив на экран с помощью цикла for и функции printf().
  6. Для выхода из программы используется функция system(PAUSE).
  7. Возвращаемое значение функции main() - EXIT_SUCCESS.
  8. В функции newarray() используется два вложенных цикла for.
  9. Внутренний цикл for выполняется до тех пор, пока не будет найден элемент, который повторяется в массиве.
  10. Если такой элемент найден, то для него выделяется память с помощью функции malloc() и сохраняется указатель на этот элемент в новом массиве.
  11. Функция strcmp() используется для сравнения двух строк.
  12. Если строки равны, то они копируются в новый массив с помощью функции strcpy().
  13. Переменная m используется для подсчета количества элементов в новом массиве.
  14. В конце функции newarray() переменная razm присваивается новое значение - m+1. Непонятно, для чего это делается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.667 из 5
Похожие ответы