我有以下代码,只要调用strcpy
函数,代码就会崩溃。当这些行被注释掉时,代码不会崩溃。有什么问题?
char cities[80][17];
char char_distances[40][2];
int distances[40];
char cities_sorted[20][17];
while (!feof(Text)) {
fscanf(Text, "%[^\t]\t%[^\t]\t%[^\n]\n",
cities[i], cities[i + 1], char_distances[i]);
distances[i] = atoi(char_distances[i]);
printf("City_start: %s City_end: %s Distance: %d \n",
cities[i], cities[i + 1], distances[i]);
static char uniqueCities[21][17];
int uniqueCitiesCount;
for (int j = 0; j < 21; j++) {
printf("%s\n", uniqueCities[i]);
bool start_unique = !areEqual(cities[i], cities[j]);
bool end_unique = !areEqual(cities[i], cities[j + 1]);
if (start_unique) {
strcpy(uniqueCities[uniqueCitiesCount], cities[i]);
uniqueCitiesCount++;
}
if (end_unique) {
strcpy(uniqueCities[uniqueCitiesCount], cities[i + 1]);
strcpy(uniqueCities[uniqueCitiesCount], cities[i + 1]);
uniqueCitiesCount++;
}
}
i++;
}
由于
答案 0 :(得分:1)
出了什么问题?
很多事情:
您发布了一个代码片段:这不足以帮助您诊断问题。发布的代码无法编译和测试,甚至没有片段中所有符号的定义:如何定义Text
?怎么打开的?是否保证与NULL
不同?
i
未在片段中定义,如何定义?是初始化了吗?
while (!feof(Text))
不是测试输入结束的好方法,您应该将fscanf()
的结果与预期的转化次数进行比较。
fscanf(Text, "%[^\t]\t%[^\t]\t%[^\n]\n",
没有足够的信息来避免缓冲区溢出。应以这种方式指定要存储到数组中的最大字符数:fscanf(Text, "%16[^\t]\t%16[^\t]\t%1[^\n]\n",
。但请注意,如果输入与这些限制不一致,则转换将失败,并且输入文件的其余部分将被读取为不同步。您应该将这些行读入行缓冲区并使用sscanf()
来解析这些行。
char char_distances[40][2];
定义一个数组数组,该数组只能包含1个字符和一个空终止符。距离必须全部表示为输入文件中的单个数字。您可能应该使用更大的大小定义数组,或使用distances
转换说明符将距离直接转换为%d
数组。
int uniqueCitiesCount;
定义了一个未初始化的局部变量。在循环中使用它会调用未定义的行为,因为您可能尝试访问2D数组的末尾。
printf("%s\n", uniqueCities[i]);
将打印一个空字符串,因为尚未将任何城市复制到此数组中。
bool start_unique = !areEqual(cities[i], cities[j]);
如何定义bool
和areEqual()
?
strcpy(uniqueCities[uniqueCitiesCount], cities[i + 1]);
重复。索引i + 1
不正确。
循环中的逻辑是扭曲的,可能存在缺陷。您应该只将城市名称与uniqueCities
中的所有条目进行比较,并且只有在找不到它的情况下才将其添加到循环之后。