我如何使用指针移动到这个数组(函数)而不是数组订阅

时间:2018-04-28 16:15:29

标签: c arrays pointers

我的问题是在生成首字母缩略词函数,我怎么能使这个函数以指针算​​术方式而不是数组下标。 没有弄乱结构本身,教授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 :(得分:1)

因为函数参数是作为指针提供的,所以可以使用 来使用指针算法实现目标,如下所示:
(评论中的解释)。

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中传递足够的空间,以便为course_name中的每个字容纳1个字节,+ 1个额外字节。例如,如果course_name定义为:

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

然后course_acronym必须用空格定义至少7个字节。 (对于NULL终止,字数+ 1)