gpt4 book ai didi

c - 为什么我在 C 中有一个不兼容的指针类型?

转载 作者:太空宇宙 更新时间:2023-11-04 07:26:28 25 4
gpt4 key购买 nike

我必须为我的 C 编程编写一个程序,该程序使用动态数组将字符串读入 typedef 结构,然后计算名称中元音和辅音的数量,元音是“a”、“e” , 'i', 'o', 'u' 和 'y'。字符 – ('-') 既不是辅音字母也不是元音字母。然后我需要更新数据,为每个数据添加 3 岁并打印出数据。一切都必须在单独的函数中。

  • 计算所有7个名字中元音和辅音的数量
  • 必须使用 typedef 结构和动态分配的数组创建
  • 稍后应通过向每个配置文件添加 3 年来更新函数并打印最终结果

我需要分析的数据是这样的:

弗雷德打火石38男

Barney Rubble36男

威尔玛打火石37女

Betty Rubble36女

鹅卵石打火石4女

Bam-Bam Rubble3Male

恐龙打火石2男

这就是我到目前为止所得到的,但是程序一直告诉我我有一个不兼容的指针类型,我无法弄清楚错误在哪里。

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


typedef struct
{
char name[20];
int age[2];
char gender[6];
}CARTOON;

// Function Prototype Declarations
int printit(CARTOON *, FILE *);
int loaddata(CARTOON *, int, FILE *, FILE *);
void countVowel (char **pNames, int *vowel, int *consonants);
void printResults (int vowel, int consonants);

// Main
int main (void)
{
char input[40];

int namesIndex;
int vowel;
int consonants;

CARTOON* pNames;
FILE *tptr;
FILE *bptr;


FILE *fptr; //reading in the file "data.txt"
if ((fptr=fopen("data.txt", "r"))==NULL)
{
printf("Error opening data.txt\n");
return -1;
}

if((bptr=fopen("lab5dat.bin","wb"))==NULL)
{
printf("Error creating lab4.bin\n");
return 2;
}

pNames =(char**)calloc(8,sizeof(CARTOON));
namesIndex = 0;
while (namesIndex < 8 && fgets(input,40,fptr))
{
*(pNames + namesIndex)=(char*) calloc(strlen(input)+1, sizeof(char));//pointer to first string in array namesIndex
strcpy(*(pNames + namesIndex), input);
namesIndex++;
}
*(pNames + namesIndex)=NULL;
namesIndex = 0;
pNames=(CARTOON*) calloc(12,sizeof(CARTOON));
loaddata(pNames, namesIndex, tptr, bptr);
fclose(tptr);
fclose(bptr);
if((bptr=fopen("lab5dat.bin","rb"))==NULL)
{
printf("Error opening lab5dat.bin\n");
return 3;
}
//printit(pNames, bptr);



// Prints the items in the "lab3.dat" file.
namesIndex=0;
while (*(pNames + namesIndex))
{
printf("%s\n", *(pNames + namesIndex));
namesIndex++;
}

// Calls function countVowel
countVowel (pNames, &vowel, &consonants);

//Calls function printResults
printResults(vowel, consonants);

system("pause");
return 0;
} //end


int printit(CARTOON *pNames, FILE *bptr)
{
int num;
printf("Data from print \n\n");
//num=fread(pNames, sizeof(CARTOON), 1, bptr);
while (!(feof(bptr)))
{
num=fread(pNames, sizeof(CARTOON), 1, bptr);
printf("%s %d %s \n",pNames->name,pNames->age,pNames->gender);
}
return 0;
}

int loaddata( CARTOON *pNames, int namesIndex, FILE *tptr, FILE *bptr)
{
printf("Data from loaddata\n\n");
while (!(feof(tptr)))
{
fgets((pNames + namesIndex)->name,20,tptr);
fscanf(tptr,"%d",&pNames[namesIndex].age);
fgets((pNames + namesIndex)->gender,18,tptr);
fwrite((pNames + namesIndex),sizeof(CARTOON),1,bptr);
printf("%s\n", (pNames + namesIndex)->name);
namesIndex++;
}
return 0;
}


//function countVowel will count the number of vowels and consonants
void countVowel (char **pNames, int *vowel, int *consonants)
{
int namesIndex;
int stringIndex;

namesIndex=0;
stringIndex=0;
*vowel=0;
*consonants=0;

while(*(pNames + namesIndex))
{
stringIndex=0;
while(stringIndex<strlen(*(pNames + namesIndex)))
{
if (isalpha (pNames[namesIndex][stringIndex] )) //Reads only alphabets
switch (toupper(pNames[namesIndex][stringIndex])) //makes everything capitalized.
{ case 'A': (*vowel)++ ;break; //*vowel count gets incremented by 1 whenever a vowel is found.
case 'E': (*vowel)++ ;break;
case 'I': (*vowel)++ ;break;
case 'O': (*vowel)++ ;break;
case 'U': (*vowel)++ ;break;
case 'Y': (*vowel)++ ;break;
default: (*consonants)++;break; // Everything that is not a vowel increments consonants by 1.
}

stringIndex++; // goes to the next index in the string
}

namesIndex++; //goes to the next array index, when end of string is reached
}

}

//Prints the result of the number of vowels and consonants
void printResults (int vowel, int consonants)
{
printf ("\n\nThere are %d vowels and %d consonants\n\n", vowel, consonants);
}

现在错误在这两行代码之间

*(pNames + namesIndex)=(char*) calloc(strlen(input)+1, sizeof(char));//pointer to first string in array namesIndex
strcpy(*(pNames + namesIndex), input);

最佳答案

您在代码中以两种不同的方式使用 pNames。

 CARTOON* pNames;
...
pNames =(char**)calloc(8,sizeof(CARTOON));
...
pNames=(CARTOON*) calloc(12,sizeof(CARTOON));

pNames 的类型是为第二次分配而适当声明的,但不是第一次。在将第二个分配分配给与第一个分配相同的指针而不释放时,您还泄漏了内存(即第一个分配)。

关于c - 为什么我在 C 中有一个不兼容的指针类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17915145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com