C strcpy崩溃代码

时间:2018-02-17 15:14:29

标签: c strcpy

我有以下代码,只要调用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++;
}

由于

1 个答案:

答案 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]);如何定义boolareEqual()

  • strcpy(uniqueCities[uniqueCitiesCount], cities[i + 1]);重复。索引i + 1不正确。

  • 循环中的逻辑是扭曲的,可能存在缺陷。您应该只将城市名称与uniqueCities中的所有条目进行比较,并且只有在找不到它的情况下才将其添加到循环之后。