ここでの初心者の皆さん、私は宿題を与えられました。そこでは、geditを使用して、コマンドラインからファイル名を読み込むプログラムを設計し、getNextWordメソッドを設計します。英数字以外のすべてを無視して(大文字を小文字に変換して)、各ファイルを一度に1つずつ開き、単語を返すだけです。私がハングアップしているのは、インストラクターが私たちを助けるためにstrdup()関数を与えてくれただけでなく、isspace、alnumなどです。とにかく、このサイトでstrdup()を調べた後、Cの基本とサイトなど私が理解していないことがあるに違いありません。私のプログラムはコンパイルされ(gcc -Wall -pedantic -std = c99 words.c -o wordsを使用します)、strdup()が暗黙的に使用されているという警告だけでコンパイルされます。同じディレクトリにいくつかのテキストファイルを含むプログラムを実行すると、ヒープの境界を超えて実行されているかのようにゴブリーグックが出力され、セグメンテーション違反(コアダンプ)が発生します。ポインタの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;
}