【问题标题】:C strcpy crashes codeC strcpy 崩溃代码
【发布时间】:2018-02-17 15:14:29
【问题描述】:

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

谢谢

【问题讨论】:

  • 你确定 city[i + 1] 没有超出数组的范围吗?你能试试 gdp 看看它在哪个比较中与哪个索引值崩溃
  • 当 i = 6 时崩溃
  • 不要while (!feof(Text))
  • 我没有看到你对uniqueCitiesCount有价值?
  • ...或'i',就此而言:(

标签: c strcpy


【解决方案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 个字符和一个空终止符的数组数组。距离必须在输入文件中全部表示为单个数字。您可能应该定义更大尺寸的数组,或者使用%d 转换说明符将距离直接转换为distances 数组。

  • int uniqueCitiesCount; 定义了一个未初始化的局部变量。在您的循环中使用它会调用未定义的行为,因为您可能会尝试访问超出二维数组的末尾。

  • printf("%s\n", uniqueCities[i]); 将打印一个空字符串,因为尚未将任何城市复制到此数组中。

  • bool start_unique = !areEqual(cities[i], cities[j]);boolareEqual()是如何定义的?

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

  • 循环中的逻辑被扭曲并且可能存在缺陷。您只需将城市名称与 uniqueCities 中的所有条目进行比较,如果未找到则仅将其添加到循环后的 this 数组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多