Arrays 使用指针数组的拼写检查程序
我正在尝试创建一个拼写检查程序,该程序读取一个文件,该文件包含约3000个无序的3-4个字母单词,每个单词在一行上,按字母顺序排序,然后打印出来 我有一个正在使用的“标准”数组形式,array[][],但是我试图修改程序,使其仅使用指针。我认为,通过根据char的大小*文件的大小对数组进行mallock,程序将有足够的内存来正确执行,但是当我运行代码时,指向while循环,我会不断得到SEGVArrays 使用指针数组的拼写检查程序,arrays,c,pointers,segmentation-fault,Arrays,C,Pointers,Segmentation Fault,我正在尝试创建一个拼写检查程序,该程序读取一个文件,该文件包含约3000个无序的3-4个字母单词,每个单词在一行上,按字母顺序排序,然后打印出来 我有一个正在使用的“标准”数组形式,array[][],但是我试图修改程序,使其仅使用指针。我认为,通过根据char的大小*文件的大小对数组进行mallock,程序将有足够的内存来正确执行,但是当我运行代码时,指向while循环,我会不断得到SEGV #include <stdio.h> #include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void bubbleSortWordsArray(char **array, int wordCount, int arrSize);
void printWordsArray(char **array, int wordCount);
int numOfLines(FILE *filePoint);
int main(int argc, char **argv) {
FILE *fp = fopen(argv[1], "r");
int i = 0, size = numOfLines(fp);
char **words = (char **)malloc(sizeof(char) * size);
if (fp == NULL) {
fprintf(stderr, "fopen failed");
exit(EXIT_FAILURE);
}
while (fgets(words[i], size, fp)) {
words[i][strlen(words[i]) - 1] = '\0';
i++;
}
fclose(fp);
bubbleSortWordsArray(words, i, size);
printWordsArray(words, i);
free(words);
return (0);
}
void bubbleSortWordsArray(char **array, int wordCount, int arrSize)
{
int c;
int d;
char *swap = (char *)malloc(sizeof(char) * arrSize);
for (c = 0; c < (wordCount - 1); c++) {
for (d = 0; d < (wordCount - c - 1); d++) {
if (0 > strcmp(array[d], array[d + 1])) {
strcpy(swap, array[d]);
strcpy(array[d], array[d + 1]);
strcpy(array[d + 1], swap);
}
}
}
}
void printWordsArray(char **array, int wordCount)
{
int i;
printf("\n");
for (i = 0; i < wordCount; i++) {
printf("%s\n", array[i]);
}
}
int numOfLines(FILE *filePoint) {
int c, count;
count = 0;
for (;; ) {
c = fgetc(filePoint);
if (c == EOF)
break;
if (c == '\n')
++count;
}
rewind(filePoint);
return count+1;
}
#包括
#包括
#包括
void bubbleSortWordsArray(字符**数组,整数字计数,整数arrSize);
void printWordsArray(字符**数组,整数字数);
整数行(文件*文件点);
int main(int argc,字符**argv){
文件*fp=fopen(argv[1],“r”);
int i=0,size=numOfLines(fp);
字符**字=(字符**)malloc(大小(字符)*大小);
如果(fp==NULL){
fprintf(标准,“fopen失败”);
退出(退出失败);
}
while(fgets(单词[i],大小,fp)){
单词[i][strlen(单词[i])-1]='\0';
i++;
}
fclose(fp);
bubbleSortWordsArray(单词、i、大小);
印刷文字(文字,i);
免费(字);
返回(0);
}
void bubbleSortWordsArray(字符**数组,整数字数,整数arrSize)
{
INTC;
int d;
char*swap=(char*)malloc(sizeof(char)*arrSize);
对于(c=0;c<(字数-1);c++){
对于(d=0;d<(字数-c-1);d++){
如果(0>strcmp(数组[d],数组[d+1])){
strcpy(交换,数组[d]);
strcpy(数组[d],数组[d+1]);
strcpy(数组[d+1],交换);
}
}
}
}
void printWordsArray(字符**数组,整数字数)
{
int i;
printf(“\n”);
对于(i=0;i
尝试以下方法:
char **words = (char **)malloc(sizeof(char*) * size);
for(i = 0; i < size; i++){
words[i] = (char*)malloc(sizeof(char) * (someValue + 2));
}
char**words=(char**)malloc(sizeof(char*)*size);
对于(i=0;i
其中someValue将是单词的最大长度(如果只有3-4个字母的单词,则将其设为4)。将2添加到此someValue中,这样您还可以存储表示每个单词结尾的'\n'和'\0'。每个单词都将是一个新字符串
char **words = (char **)malloc(sizeof(char) * size);
首先,跳过强制转换并使用变量而不是类型。这样,您就可以避免使用char
而不是char*
创建的错误。请在此处阅读更多信息:
第二。这里所做的只是为一些指针分配空间,但指针并不指向任何地方。之后你需要这样的东西:
for(int i=0; i<size; i++)
words[i] = malloc(sizeof (*words[0]) * maxwordsize);
for(int i=0;i您需要size
指针,但您只分配size
字符。而且您从不为字[i]分配任何内存
。另外:您可以在numOfLines
中添加1,以防最后一行不是以\n
结尾。我编辑了代码以反映您的建议,将for循环直接放在我的变量初始化下面。但是,现在我的“摘要”导致堆缓冲区溢出在我的终端中,指向我的while循环。@Davospike然后你需要进行一些调试。如果这是你第一次真正使用指针,我还建议从更简单的开始。我刚刚指出了最明显的缺陷。导致缓冲区溢出的一个原因可能是maxwordsize
需要内存空间零终止符。如果每行中有3-4个字母单词,单词[i]
必须至少为6个字节提供空间。4个字符+'\n'
+0
for(int i=0; i<size; i++)
words[i] = malloc(sizeof (*words[0]) * maxwordsize);