我遇到了一个奇怪的错误。当我编译我的代码时,它给了我以下消息:
%i??
[R?
R?
?
Desktop/prog2
Terminal
51/sls2t0f16cd4dzl3640n4p2w0000gn/T/
private/tmp/com.apple.launchd.AJrzeyltFv/Render
ION=343.6
ER=Frank
Listeners
in:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin
ank
E=/Users/Frank
nk/Desktop/prog2
Segmentation fault: 11
logout
我知道这是由于内存问题造成的。但是,我给了dictionary2与原始字典相同的内存,为什么它不能编译整个列表呢?
这是我的代码(我知道这有点偏长,但我觉得有必要传达正在发生的事情):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
struct entry
{
char word[15];
char definition[50];
};
void dictionarySort(struct entry dictionary[]) {
int i, j, k, word1, word2, dict2Length = 1;
bool bnf = false;
struct entry dictionary2[100] = {{}};
for (i = 0; i <= strlen(&dictionary->word[0]); i++) {
strcpy(&dictionary2[0].word[i], &dictionary[0].word[i]);
}
i = 0;
word1 = 1;
word2 = 0;
while (isalpha(dictionary[word1].word[0])) {
while (i <= strlen(&dictionary->word[word1])) {
//printf("%c", dictionary[word1].word[i]);
if (dictionary[word1].word[i] == dictionary2[word2].word[i]) {
i++;
bnf = false;
}
else if (dictionary[word1].word[i] < dictionary[word2].word[i]) {
//insert section to prevent back-and-forth cycling
if (bnf == false) {
word2--;
bnf = true;
}
else { //(dictionary[word1].word[i] < dictionary[word2].word[i])
//open up new index by moving everything above up one, insert at word
for (j = dict2Length; j > word2; j--) {
//word
for (k = 0; k <= strlen(&dictionary2->word[0]); k++) {
strcpy(&dictionary2[j+1].word[k], &dictionary2[j].word[k]);
}
//definition
for (k = 0; k <= strlen(&dictionary2->word[0]); k++) {
strcpy(&dictionary2[j+1].definition[k], &dictionary2[j].definition[k]);
}
}
//for (k = 0; k < strlen(&dictionary1->word[word1]))
for (k = 0; k < strlen(dictionary[word1].word); k++) {
strcpy(&dictionary2[word2].word[k], &dictionary[word1].word[k]);
}
for (k = 0; k < strlen(dictionary[word1].definition); k++) {
strcpy(&dictionary2[word2].definition[k], &dictionary[word1].definition[k]);
}
dict2Length++;
break;
}
}
else {
//insert section to prevent back-and-forth cycling
if (bnf == false) {
word2++;
bnf = true;
}
else { //(dictionary[word1].word[i] < dictionary[word2].word[i])
//open up new index by moving everything above up one, insert at word
for (j = dict2Length; j > word2; j--) {
//word
for (k = 0; k <= strlen(&dictionary2->word[0]); k++) {
strcpy(&dictionary2[j+1].word[k], &dictionary2[j].word[k]);
}
//definition
for (k = 0; k <= strlen(&dictionary2->word[0]); k++) {
strcpy(&dictionary2[j+1].definition[k], &dictionary2[j].definition[k]);
}
}
for (k = 0; k < strlen(dictionary[word1].word); k++) {
strcpy(&dictionary2[word2].word[k], &dictionary[word1].word[k]);
}
for (k = 0; k < strlen(dictionary[word1].definition); k++) {
strcpy(&dictionary2[word2].definition[k], &dictionary[word1].definition[k]);
}
dict2Length++;
break;
}
}
}
word1++;
}
word2 = 0;
for (i = 0; i < dict2Length; i++) {
printf ("%s\n", dictionary2[i].word);
}
}
int main (void) {
struct entry dictionary[100] =
{{"aerie", "a high nest"},
{"abyss", "a bottomless pit"},
{"ahoy", "a nautical call of greeting"},
{"addle", "to become confused"},
{"aardvark", "a burrowing African mammal"},
{"agar", "a jelly made of seaweed"},
{"acumen", "mentally sharp; keen"},
{"aigrette", "an ornamental cluster of feathers"},
{"affix", "to attach"},
{"ajar", "partially opened"}};
dictionarySort(dictionary);
}
答案 0 :(得分:2)
这一行的索引回到前面
strcpy(&dictionary2[0].word[i], &dictionary[0].word[i]);
应该是
strcpy(&dictionary2[i].word[0], &dictionary[i].word[0]);
甚至更好
strcpy(dictionary2[i].word, dictionary[i].word);
此外,您的循环for (i...)
基于strlen(&dictionary->word[0])
。您是否应该将数组条目的数量作为参数传递给dictionarySort()
?就目前而言,循环基于第一个字典条目的长度。
我必须传递调试排序。太可怕了。只需使用qsort()
。
答案 1 :(得分:2)
使用qsort
void dictionarySort(struct entry dictionary[]) {
struct entry dictionary2[100] = {{"",""}};
int i, n;
for (i = 0; i < 100 && dictionary[i].word[0] != '\0'; ++i){
dictionary2[i] = dictionary[i];
}
n = i;
qsort(dictionary2, n, sizeof(*dictionary2), strcmp);
for (i = 0; i < n; ++i) {
printf ("%s\n", dictionary2[i].word);
}
}
答案 2 :(得分:1)
看起来你在计算词典长度方面遇到了麻烦。当你运行它时,它表示长度类似于1701996321,这看起来要比它应该高得多。然后,在最后一个for循环中,直到你打印单词的结尾,你可能超出了字典的范围。注释掉printf,你会看到错误消失了。我首先考察dict2Lenght。
for (i = 0; i < dict2Length; i++) {
printf ("%s\n", dictionary2[i].word);
}