Как разделить строку и назначить их struct

#c

#c

Вопрос:

Я пытаюсь разделить строку на , и присвоить их структуре.

Пример строки

 char t1[] = "185213,Example Name,88";
  

И у меня есть эта структура.

 typedef struct {
    int studentNumber;
    char studentName[200];
    int grade;
} STUDENT;
STUDENT students[]= {
    {...},
    {...},
    {...}
}
  

Я хочу разделить строку и вставить в массив students struct. Я имею в виду, что 185213 — это число, имя примера — это имя, а 88 — класс.

Ответ №1:

Если вы заранее знаете, что ваши строки всегда будут содержать только три поля в формате «%d,%s,%d», то вам не нужна сложная логика с циклами, проверкой ввода и так далее. Было бы достаточно чего-то более простого, разбирающего каждый элемент отдельно:

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

typedef struct {
    int studentNumber;
    char *studentName;
    int grade;
} STUDENT;

int main(){  
    STUDENT *student = malloc(sizeof(STUDENT));
    student->studentName = malloc(201); // Space for 200 characters   ''
    char *eptr;
    
     char t1[] = "185213,Example Name,88";
     char *token = strtok(t1, ",");                       // Read studentNumber
     student-> studentNumber = strtol(token, amp;eptr, 10);
     token = strtok(NULL, ",");                           // Read the studentName
     strcpy(student->studentName, token);
     token = strtok(NULL, ",");                          // Read the grade
     student-> grade = strtol(token, amp;eptr, 10);
          
     printf("%dn", student-> studentNumber);
     printf("%sn", student-> studentName);
     printf("%dn", student-> grade);
     ... 
}
  

Вы можете использовать функцию strtok для анализа строк на основе разделителя "," , функцию strcpy для копирования строк, проанализированных из strtok вашего struct , и функцию strtol для анализа int значения из строки, прочитанной из strtok .

Разница между STUDENT struct тем, что я опубликовал, и вашим, заключается в том, что поле char *studentName было динамически выделено (как правильно указано в комментариях).

Ответ №2:

Вы можете сделать это следующим образом (используя atoi() from stdlib.h и strcpy from string.h ).

 char t1[] = "185213,Example Name,88";    
char * pch;

STUDENT s;
pch = strtok (t1,",");
if (pch != NULL) s.studentNumber = atoi(pch);

pch = strtok (NULL,",");
if (pch != NULL) strcpy(s.studentName, pch);   

pch = strtok (NULL,",");
if (pch != NULL) s.grade = atoi(pch);