【问题标题】:Unexpected Acess violation (itoa) [closed]意外的访问冲突(itoa)[关闭]
【发布时间】:2016-12-03 19:15:53
【问题描述】:

在 K&R 书中,第 3 章第 64 页有 itoa 代码。我试图编译代码,但没有成功。代码如下:

#include <iostream>
#include <conio.h>
using namespace std;
void itoa(int, char*);

int main(void) {
    _getch();
    char arr[100];
    itoa(-18,arr);
    _getch();
    return 0;
}

void itoa(int n, char* s) {
    int i, sign;
    if ((sign = n) < 0) {
        n = -n;
    }
    i = 0;
    do {
        s[i++] = n % 10 + '0';
    } while ((n / 10) > 0);
    if (sign < 0) s[i++] = '-';
    s[i] = 0;
    //reverse(s);
}

输出:

第25行访问冲突,即:s[i++] = n % 10 + '0';

【问题讨论】:

  • (n / 10) --> (n /= 10)
  • 这不是编译错误。
  • 调试器是解决此类问题的正确工具。 在询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • s[i++] 将超出范围,因为如果循环仅分支一次,则循环永远不会结束,因为未分配 n。 (见 BLUEPIXY 的评论)
  • @πάνταῥεῖ:它是半破解的 C 代码,因此可以通过 C++ 编译器进行编译。 K&R 是一本 C 书;所有程序都是C程序。

标签: c++ access-violation itoa


【解决方案1】:

itoa 有一个无限循环,在生成 100 个数字后超出了arr 的边界。循环不会修改n,因此它可以在n 达到0 时终止。将while 条件更改为使用n /= 10 而不是n / 10。

【讨论】:

  • 我明白了,不是 n/2,而是 n/=2。
  • 如果答案正确,请考虑采纳。
  • 我现在做到了。由于时间限制,我无法做到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
相关资源
最近更新 更多