以下程序存儲每個單詞,然後用一些出現次數打印它們。
全球typedef
聲明:函數在結構數組中搜索 - 停止條件未知
typedef struct {
char * word;
int occ;
}
words;
words *data=NULL;
我有搜索功能的問題。我創建了一個函數返回int
,看起來像這樣:(max
是結構數組的不斷更新的大小,這就是爲什麼我把搜索功能達到EOF
後)。
int search(char *word,int max)
{
int i;
for(i=0; i<max; i++)
{
if(!strcmp(data[i].word,word)) return i;
}
return -1;
}
但是我注意到我中號應該寫具有原型搜索功能:
struct abc *find(char *word)
所以我創建了下面的代碼:
struct words *findword(char *word)
{
struct words *ptr;
for (ptr = data; ptr != NULL; ptr++) { /* IS THE STOP CONDITION OK? */
if (strcmp(word, ptr->word) == 0)
return ptr;
}
return NULL;
}
我在編譯過程中收到許多錯誤:
reverse.c: In function ‘findword’:
reverse.c:73: warning: assignment from incompatible pointer type
reverse.c:73: error: increment of pointer to unknown structure
reverse.c:73: error: arithmetic on pointer to an incomplete type
reverse.c:74: error: dereferencing pointer to incomplete type
reverse.c: In function ‘main’:
reverse.c:171: error: ‘which’ undeclared (first use in this function)
reverse.c:171: error: (Each undeclared identifier is reported only once
reverse.c:171: error: for each function it appears in.)
make: * [reverse.o] Error 1
which
是分配給我首先寫的搜索功能返回的int
變量。 與which
該錯誤很容易固定,但我不知道如何替換(解決方案與我的基本搜索功能工作):
data[which].occ++;
如何解決此問題,以便它會與我的工作新的搜索方法?
編輯
main()
補充說:
int main(int argc, char **argv)
{
char *word;
words *temp;
int c,i,num;
/*int which;*/
FILE *infile;
if(argc!=2) {}
if((infile=fopen(argv[1],"r"))==NULL) {}
num=0;
while(1)
{
c=fgetc(infile);
if(c==EOF) break;
if(!isalpha(c)) continue;
else ungetc(c,infile);
word=getword(infile);
word=convert(word);
/*which=search(word,num);*/
if(findword(word))
{
if(!(temp=realloc(data,sizeof(words)*(num+1))))
{}
else
data=temp;
data[num].word=strdup(word);
data[num].occ=1;
num++;
}
else
data[which].occ++;
free(word);
}
sort(num-1);
for(i=0;i<num;i++)
{}
free(data);
if(fclose(infile))
{}
return 0;
}
我已經離開{}
代碼例如無關件。錯誤處理。
EDIT2 我所要求的上面的事,是固定的。但是,我現在遇到了seg故障。 我給一個鏈接到整個代碼,我不想把它放在一個編輯的文章,因爲它會造成一個大混亂。 Seg故障由第73行和第152行引起(strcmp無法正常工作)。希望完整的代碼更容易理解。 FULL CODE
爲什麼不只需將該'int max'參數移動到一個全局變量並使用第一個版本的代碼?第二個版本將會崩潰,因爲指針將會增加並增加超過'data []'數組的末尾。 –
@AlexeyFrunze我不能使用第一個函數,因爲它返回'int',我應該返回結構數組中的特定位置。 Ad.2 - 如何解決這個問題,以便指針在不斷擴大的結構數組結尾處停止遞增? –
返回'&data [i]'而不是'i',那有什麼問題?除了1)引入元素計數器(或指向最後一個元素的指針)並將當前檢查的位置與該OR進行比較(我不建議這樣做)之外,您不能修復該指針,2)將特殊指示符嵌入到數據[]的最後一個元素並檢查它。 –