没有0反而会报3221225477的奇妙代码

P1307 [NOIP2011 普及组] 数字反转

miyou379 @ 2022-07-18 23:37:28

#include <bits/stdc++.h>
using namespace std;

stack<int> s;
char h[13] = {};
int flag = 0;
int lgth;

int main() {
    scanf("%s", &h);
    lgth = strlen(h);
    if (h[0] == '-') {
        flag = 1;
        for (int j = 1; j <= lgth - 1; j++)
            s.push(h[j]);
        lgth -= 1;
        printf("-");
    } else {
        for (int m = 0; m <= lgth - 1; m++)
            s.push(h[m]);
    }
//输出
    if (s.top() != '0') {
        printf("%c", s.top());
        s.pop();
    } else {
        s.pop();
        lgth -= 1;
    }
    for (int p = 1; p <= lgth; p++) {
        printf("%c", s.top());
        s.pop();
    }
    return 0;
}

如题,输入数据为-980时能够正常运行,答案正确,若输入-98则会返回3221225477.不带负号的情况是一样的,个人感觉是输出注释下面那个if有问题,请求各位神犇帮助 提交界面5个AC 3个WA 3个RE


by 035966_L3 @ 2022-07-18 23:44:23

[Line 10]    scanf("%s", &h);

应去掉 &h 中的 &


by Martin8521 @ 2022-07-18 23:48:15

@miyou379

在你的程序第23到第29行中,如果字符串结尾不是0仍会弹栈,导致后面在访问栈顶时会发生内存越界,将栈顶不为0的判断删掉就行


by Martin8521 @ 2022-07-18 23:50:13

而且你只判断了一次结尾为0的情况,应当改为

while (s.top() == '0') {
        s.pop();
        lgth -= 1;
    }

同时应当对输入为0时进行特判


by Martin8521 @ 2022-07-18 23:52:50

@miyou379

AC程序是这样的

#include <bits/stdc++.h>
using namespace std;

stack<int> s;
char h[13] = {};
int flag = 0;
int lgth;

int main() {
    scanf("%s", &h);
    if(h[0] == '0'){
        cout << "0";
        return 0;
    }
    lgth = strlen(h);
    if (h[0] == '-') {
        flag = 1;
        for (int j = 1; j <= lgth - 1; j++)
            s.push(h[j]);
        lgth -= 1;
        printf("-");
    } else {
        for (int m = 0; m <= lgth - 1; m++)
            s.push(h[m]);
    }
//输出
    while (s.top() == '0') {
        s.pop();
        lgth -= 1;
    }
    for (int p = 1; p <= lgth; p++) {
        printf("%c", s.top());
        s.pop();
    }
    return 0;
}

by miyou379 @ 2022-07-19 00:11:56

@Martin8521 谢谢,学到了!


by miyou379 @ 2022-07-19 00:12:20

@035966_L3 感谢更正,已纠正


|