Проблема чтения в строке в C для динамического ввода чисел

мелкая копия не создаст новую ссылку, но глубокая копия создаст новую ссылку. Вот программа для объяснения глубокой и мелкой копии

public class DeepAndShollowCopy {
int id;
String name;
List<String> testlist = new ArrayList<>();

/*
// To performing Shallow Copy 
// Note: Here we are not creating any references. 
  public DeepAndShollowCopy(int id, String name, List<String>testlist)
   { 

   System.out.println("Shallow Copy for Object initialization");
   this.id = id; 
   this.name = name; 
   this.testlist = testlist; 

   }
*/  

// To performing Deep Copy 
// Note: Here we are creating one references( Al arraylist object ). 
public DeepAndShollowCopy(int id, String name, List<String> testlist) {
    System.out.println("Deep Copy for Object initialization");
    this.id = id;
    this.name = name;
    String item;
    List<String> Al = new ArrayList<>();
    Iterator<String> itr = testlist.iterator();
    while (itr.hasNext()) {
        item = itr.next();
        Al.add(item);
    }
    this.testlist = Al;
}


public static void main(String[] args) {
    List<String> list = new ArrayList<>();
    list.add("Java");
    list.add("Oracle");
    list.add("C++");
    DeepAndShollowCopy copy=new DeepAndShollowCopy(10,"Testing", list);
    System.out.println(copy.toString());
}
@Override
public String toString() {
    return "DeepAndShollowCopy [id=" + id + ", name=" + name + ", testlist=" + testlist + "]";
}

}

0
задан Jonathan Leffler 18 April 2019 в 18:06
поделиться

3 ответа

Благодаря Сержу, я смог собрать свой код, который приведен ниже.

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

// create a struct, call it pupils
typedef struct
{
    char *name;
    char *dorm;
}
pupils;

int main(void)
{
    // Allocate space for students - generally dynamic, here static
    int enrollment = 2;

    // create variable 'idinfo', which contains (enrollment) number of structs of type pupils  
    pupils idinfo[enrollment];

    // Prompt for students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
    // allocate memory for idinfo[i] pointers:
        idinfo[i].name = malloc(20);
        idinfo[i].dorm = malloc(20);

        printf("Enter student %d's Name ", i+1); 
        scanf("%19s", idinfo[i].name);

        printf("Enter student %d's dorm ", i+1);
        scanf("%19s", idinfo[i].dorm);
    }

    // Print students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
        printf("%s is in %s.\n", idinfo[i].name, idinfo[i].dorm);
    }
    // free allocated memory
    for (int i = 0; i < enrollment; i++)
    {
        free(idinfo[i].name);
        free(idinfo[i].dorm);
    }
}
0
ответ дан Mike 18 April 2019 в 18:06
поделиться

Предполагая, что вы не хотите использовать магию cs50, вам придется распределять и освобождать строки. Из вашего кода я также предполагаю, что входные строки должны быть короче 20 символов. Следующий код даже не гарантирует, что это правда, но также не даст сбоя, а просто даст неожиданные результаты.

Код может быть:

int main(void)
{
    // Allocate space for students - generally dynamic, here static
    int enrollment = 2;

    // create variable 'idinfo', which contains (enrollment) number of structs of type pupils  
    pupils idinfo[enrollment];

    // Prompt for students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
        // allocate memory for idinfo[i] pointers:
        idinfo[i].name = malloc(20);
        scanf("%19s", idinfo[i].name);
        idinfo[i].dorm = malloc(20);
        scanf("%19s", idinfo[i].dorm);
    }

    // Print students' names and dorms
    for (int i = 0; i < enrollment; i++)
    {
        printf("%s is in %s.\n", idinfo[i].name, idinfo[i].dorm);
    }
    // free allocated memory
    for (int i = 0; i < enrollment; i++)
    {
        free(idinfo[i].name);
        free(idinfo[i].dorm);
    }
}
0
ответ дан chux 18 April 2019 в 18:06
поделиться

Вы, вероятно, хотите что-то вроде этого:

#include <cs50.h>    // needed for get_xxx functions and other cs50 stuff
...
// Prompt for students' names and dorms
for (int i = 0; i < enrollment; i++)
{
   idinfo[i].name = get_string("Name: ");
   idinfo[i].dorm = get_string("Dorm: ");
}

Но это должно быть отражено в документации, которую вам дали.

Мой совет - вообще не использовать scanf, а только методы ввода cs50 get_xxx.

И будьте осторожны: CS50 string - это не настоящий «строковый» тип, а просто то же самое, что и char *.

0
ответ дан Jabberwocky 18 April 2019 в 18:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: