如果 Exam 函式的 *pMonthToStudy 引數等于對應人的出生月份(birthDates[] 順序對應于 names[] 順序),則下面的程式必須回傳指向來自 names[] 的姓名陣列的指標。在六月的情況下,函式應該回傳“John, James, Richard”。輸出必須與我的示例具有完全相同的視圖。
我分配的記憶體正確嗎?如果是,如何將這些值分配給回傳指標并在 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;
}
uj5u.com熱心網友回復:
首先這個宣告
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;
}
它可以在回圈的第一次迭代中回傳 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 是一個壞主意。您應該通過函式引數傳遞參考陣列中的元素數。
uj5u.com熱心網友回復:
#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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/388192.html
下一篇:在精確位置陣列中搜索
