输出指针 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,因为在这种情况下您不会中断循环。此外,您在函数 strcmp
和 strcpy
.
中使用了不正确的表达式
改为
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;
}
如果 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,因为在这种情况下您不会中断循环。此外,您在函数 strcmp
和 strcpy
.
改为
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;
}