Как я могу использовать указатель для перемещения внутри этого массива (функции) вместо подписки массива - PullRequest
0 голосов
/ 28 апреля 2018

Мой вопрос связан с функцией создания аббревиатуры, как я могу заставить эту функцию работать арифметическим способом, а не подпиской на массив. не путаясь с самими структурами, подписывается массив prof prhobited, так что вместо этого я должен сделать это с помощью арифметики с указателями, кто-нибудь может получить руку?

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define B 2
#define N 8
typedef struct {

    int course_id;
    int course_quota;
    char course_name[50];
    char course_code[6];
    char course_acronym[N];
}course_t;

void generate_course_code(char *course_code, int course_id);
void generate_course_acronym(char *, char *);
void display();
course_t courses[B];
int main() {
    int i;
    for(i = 0; i < B; i++) {
        printf("Enter the course name: ");

        fgets(courses[i].course_name, sizeof(courses[i].course_name), stdin);
        generate_course_acronym(courses[i].course_name, courses[i].course_acronym);


        printf("Enter the course Quota: ");
        scanf("%d", &courses[i].course_quota);

        while ('\n' != getchar())
        {

        }
        courses[i].course_id = i;
        generate_course_code(courses[i].course_code, courses[i].course_id);


    }
    display();


    return 0;
}

 void generate_course_code(char *course_code, int course_id) {
    char str[6];
    course_id++;
    strcpy(course_code, "CSE");
    if (course_id < 10) {

        sprintf(str, "0%d", course_id);
    }
    else
        sprintf(str, "%d", course_id);
    strcat(course_code, str);

} 



void generate_course_acronym(char *course_name, char *course_acronym) {

    int j = 0;
    char *p = course_name;
    for (course_acronym[j++] = toupper(*p); *p != '\0'; p++) 
        if (*p == ' ') course_acronym[j++] = toupper(*(++p));
        course_acronym[j] = '\0';

} 


void display() {
    int x;

    for (x = 0; x < B; x++) {
        printf("%d. %s - %s  (%s) - %d \n", ++courses[x].course_id, courses[x].course_code, courses[x].course_name, courses[x].course_acronym, courses[x].course_quota);


    }

} 

1 Ответ

0 голосов
/ 28 апреля 2018

Поскольку аргументы функции предоставляются в виде указателей, они могут использоваться как есть для достижения вашей цели с использованием арифметики указателей, как показано ниже:
(пояснения в комментариях).

void generate_course_acronym(char *course_name, char *course_acronym) 
{
    *course_acronym = (char)toupper(*course_name); //initialize acronym to capitalized form of first character
    while(*course_name)         //test for end of string (NULL)
    {
        if(*course_name == ' ') // detect spaces between strings
        {
            course_acronym++;   // advance acronym pointer
            course_name++;      // advance source pointer beyond space.
            *course_acronym = (char)toupper(*course_name); // assign next acronym character
        }
        course_name++;          // advance source to next address location
    }
    course_acronym++;           // advance pointer to one location beyond end of acronym
    *course_acronym = '\0';     // NULL terminate, making acronym a new string
} 

Примечание: вызывающая функция должна пропускать достаточно места в course_acronym, чтобы вместить 1 байт для каждого слова в course_name, + 1 дополнительный байт. Например, если course_name определено как:

char course_name[]={"This is a fine programming class"};

затем course_acronym должен быть определен с пробелом не менее 7 байтов. (количество слов + 1 для завершения NULL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...