在这里的 C 初学者,我得到了一个家庭作业,我们将使用 gedit 设计一个程序来从命令行读取文件名并设计一个 getNextWord 方法。我们将简单地每次打开每个文件并返回单词,忽略除字母数字字符之外的所有内容(并将大写字母转换为小写字母)。我挂断的事情是我的导师给了我们 strdup() 函数来帮助我们以及 isspace、alnum 等。无论如何,在这个网站上查找 strdup() 以及 C 基础知识和网站和其他人一定有一些我不理解的东西。我的程序编译(我使用 gcc -Wall -pedantic -std=c99 words.c -o words)并且它编译时只是警告 strdup() 被隐式使用。在同一目录中运行带有几个文本文件的程序,它会打印 gobbly gook,就好像它超出了堆的边界,然后给出了分段错误(核心转储)。我想我也给了它正确的检查,例如在返回指针的 strdup 之前将 \0 放在字符数组的末尾等。这是我的代码;我不指望任何人为我做我的硬件,也许观察会有所帮助,因为我已经研究了一整天并且找不到问题。感谢您阅读本文(它没有显示,但我包括了 stdio、stdlib.h、string.h、ctype.h 也许观察会有所帮助,因为我已经研究了一整天并且找不到问题。感谢您阅读本文(它没有显示,但我包括了 stdio、stdlib.h、string.h、ctype.h 也许观察会有所帮助,因为我已经研究了一整天并且找不到问题。感谢您阅读本文(它没有显示,但我包括了 stdio、stdlib.h、string.h、ctype.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_WORD_SIZE 256
char* getNextWord(FILE* fd)
{
int index = 0;
int c;
char str[MAX_WORD_SIZE];
while((c = fgetc(fd)) != EOF){
c = fgetc(fd);
if (isspace(c)){
str[index] = '\0';
return (char*) strdup(str);
}
if (((index+1) != (MAX_WORD_SIZE-1)) && (isalnum(c))){
c = tolower(c);
str[index] = c;
index++;
}
else {
index++;
str[index] = '\0';
return (char*) strdup(str);
}
}
return NULL;
}
int main(int argc, char* argv[])
{
char** current = argv;
char* heapedString = NULL;
while (*current)
{
char* filename = *current;
FILE* fd = fopen(filename, "r");
if (fd == NULL)
{
fprintf(stderr,"can't read the file\n");
exit(-1);
}
while ((heapedString = getNextWord(fd)) != NULL)
{
heapedString = getNextWord(fd);
printf("%s\n", heapedString);
free(heapedString);
}
fclose(fd);
current++;
}
return 0;
}