C++ 意外访问冲突(itoa)

C++ 意外访问冲突(itoa),c++,access-violation,itoa,C++,Access Violation,Itoa,在K&R的书中,第64页的第3章中有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

在K&R的书中,第64页的第3章中有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);
}
#包括
#包括
使用名称空间std;
无效itoa(整数,字符*);
内部主(空){
_getch();
char-arr[100];
itoa(-18,arr);
_getch();
返回0;
}
无效itoa(整数n,字符*s){
int i,符号;
如果((符号=n)<0){
n=-n;
}
i=0;
做{
s[i++]=n%10+'0';
}而((n/10)>0);
如果(符号<0)s[i++]='-';
s[i]=0;
//反面;
}
输出:

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


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

(n/10)
-->
(n/=10)
,这不是编译错误。解决此类问题的正确工具是调试器。在询问堆栈溢出之前,应该逐行检查代码。如需更多帮助,请阅读。至少,您应该[编辑]您的问题,以包括一个重现您的问题的示例,以及您在调试器中所做的观察。
s[i++]
将超出范围,因为循环如果分支一次,就永远不会结束,因为
n
未分配。(见蓝精灵的评论)@πάνταῥεῖ: 这是C代码半黑客,所以它可以排序由C++编译器编译。K&R是一本C语言书;所有的程序都是C程序。我看,不是n/2,而是n/= 2。如果答案是正确的,考虑接受它。我现在做了。由于时间限制,我没能参加。