输出指针 returns (null) 而不是 char 值

Output pointer returns (null) instead of char value

如果 Exam 函数的 *pMonthToStudy 参数等于相应人员的出生月份(birthDates[] 顺序对应于 names[] 顺序),下面的程序必须 return 指向从 names[] 中获取的名称数组的指针.如果是 6 月,函数应该 return “John, James, Richard”。输出必须与我的示例具有完全相同的视图。

我分配的内存正确吗? 如果是,如何将这些值分配给 returning 指针并在 main 中正确输出(如果我的输出方法不正确)?

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

typedef struct {
    int day;
    char month[4];
    int year;
} DATE;

DATE birthDates[] = {{2, "Jun", 2000}, {27, "Jul", 2001}, {12, "Jun", 1999},
                     {15, "Sep", 1998}, {16, "Jun", 2000}};

char names[] = {"John, Mary, James, Elizabeth, Richard"};

char *Exam(char *pNames, DATE *pBirthDates, const char *pMonthToStudy){
    //Check if input ptr are zero or point to empty strings
    if(!pNames || !*pNames || !pBirthDates)
        return 0;
    char *pOutput = (char*) malloc(sizeof(*pNames));
    for (int i = 0; i < 5; ++i) {
        if(strcmp(pMonthToStudy, &birthDates->month[i]) == 0){
            strcpy(pOutput, &pNames[i]);
        } else
            return 0;
    }
    return pOutput;
}
int main() {
    char *pResult = Exam(names, birthDates, "Jun");
    printf("%s", pResult);
    return 0;
}

对于初学者这个声明

char names[] = {"John, Mary, James, Elizabeth, Richard"};

声明一个字符数组,其中一个元素包含字符串文字

"John, Mary, James, Elizabeth, Richard"

作为此声明的结果

char *pOutput = (char*) malloc(sizeof(*pNames));

只分配了一个字符

你的意思似乎是一个包含 5 个指向字符串文字的指针元素的数组

char * names[] = { "John", "Mary", "James", "Elizabeth", "Richard"};

然而在这个声明中有一个错误的初始化

char *pOutput = (char*) malloc(sizeof(*pNames));

你需要分配一个字符数组,能够在数组名称中存储相应的字符串文字。

如果找到目标记录,则此分配必须在 for 循环之后完成。否则该函数将发生内存泄漏。

for 循环不正确

for (int i = 0; i < 5; ++i) {
    if(strcmp(pMonthToStudy, &birthDates->month[i]) == 0){
        strcpy(pOutput, &pNames[i]);
    } else
        return 0;
}

它可以 return 在循环的第一次迭代中为 0,或者即使在找到目标记录时也可以为 0,因为在这种情况下您不会中断循环。此外,您在函数 strcmpstrcpy.

中使用了不正确的表达式

改为

char *pOutput = NULL;

int i = 0;

while ( i < 5 && strcmp( pMonthToStudy, birthDates[i].month ) != 0 ) ++i;


if ( i != 5 )
{
    pOutput = malloc( strlen( pNames[i] ) + 1 );
    if ( pOutput != NULL ) strcpy( pOutput, pNames[i] );
}

return pOutput;

注意在函数中使用幻数 5 是个坏主意。您应该通过函数参数传递引用数组中的元素数。

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

typedef struct {
    int day;
    char month[4];
    int year;
} DATE;

DATE birthDates[] = { {2, "Jun", 2000}, {27, "Jul", 2001}, {12, "Jun", 1999},
                     {15, "Sep", 1998}, {16, "Jun", 2000} };

const char *names[] = { "John", "Mary", "James", "Elizabeth", "Richard" };

char *Exam(const char **pNames, DATE *pBirthDates, const char *pMonthToStudy) {
    if (!pNames || !*pNames || !pBirthDates)
        return 0;
    char *pOutput = NULL;
    const char * prefix = ", ";
    int nSize = 0;
    int nCount = 0;
    int *arrIndexes = new int[5];

    for (int i = 0; i < 5; i++) {
        if (strcmp(pMonthToStudy, birthDates[i].month) == 0) {
            nSize += strlen(pNames[i]);

            arrIndexes[nCount] = i;

            nCount++;
        }
    }

    const int mallocSize = (nSize + (nCount - 1) * sizeof(prefix)) * sizeof(char) + 1;
    pOutput = (char*)(malloc(mallocSize));

    memset(pOutput, 0, mallocSize);

    for (int i = 0; i < nCount; i++) {
        strcat_s(pOutput, mallocSize, pNames[arrIndexes[i]]);

        if (i != nCount - 1) {
            strcat_s(pOutput, mallocSize, prefix);
        }
    }

    return pOutput;
}
int main() {
    char *pResult = Exam(names, birthDates, "Jun");
    printf("%s", pResult);
    return 0;
}