有人可以告诉我为什么我的代码会在 SPOJ 上生成分段吗?什么是分段错误错误?(FCTRL2)

发布于 2024-08-21 13:20:21 字数 1269 浏览 4 评论 0原文

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
char arr[200],res[200];
char table[150][200];

string multiply(char n[],int m)
{
    int N=strlen(n),M,temp=0,x=0;
    for(int i=0;i<N;i++)
       arr[i]=n[N-1-i];
    for(int i=0;i<N;i++)
    {
        x=m*(arr[i]-'0')+temp;
        x=m*(arr[i]-'0')+temp;
        arr[i]=(x%10)+'0';
        temp=x/10;
    }
    while(temp>0)
    {
        arr[N]=(temp%10)+'0';
        temp/=10;
        N++;
    }
    M=strlen(arr);
    for(int i=0;i<M;i++)
       res[i]=arr[M-1-i];
}
void make_table()
{
    table[0][0]='1';
    for(int i=1;i<101;i++)
    {
        multiply(table[i-1],i);
        int u=strlen(res);
        for(int j=0;j<u;j++)
        {
            table[i][j]=res[j];
        }
    }
}
int main()
{
    int tc,n;
    scanf(" %d",&tc);
    make_table();
    while(tc--)
    {
        scanf(" %d",&n);
        printf("%s\n",&table[n]);
    }
    return 0;
}

这是我解决这个问题的代码: http://www.spoj.pl/problems/FCTRL2/ 它为我生成正确的答案,但是当我提交它时,它告诉我运行时错误(分段错误)。 谁能向我解释什么是分段错误?因为我在 spoj 网站上读到它,但我不明白如何避免它以及如何升级我的代码?

#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
using namespace std;
char arr[200],res[200];
char table[150][200];

string multiply(char n[],int m)
{
    int N=strlen(n),M,temp=0,x=0;
    for(int i=0;i<N;i++)
       arr[i]=n[N-1-i];
    for(int i=0;i<N;i++)
    {
        x=m*(arr[i]-'0')+temp;
        x=m*(arr[i]-'0')+temp;
        arr[i]=(x%10)+'0';
        temp=x/10;
    }
    while(temp>0)
    {
        arr[N]=(temp%10)+'0';
        temp/=10;
        N++;
    }
    M=strlen(arr);
    for(int i=0;i<M;i++)
       res[i]=arr[M-1-i];
}
void make_table()
{
    table[0][0]='1';
    for(int i=1;i<101;i++)
    {
        multiply(table[i-1],i);
        int u=strlen(res);
        for(int j=0;j<u;j++)
        {
            table[i][j]=res[j];
        }
    }
}
int main()
{
    int tc,n;
    scanf(" %d",&tc);
    make_table();
    while(tc--)
    {
        scanf(" %d",&n);
        printf("%s\n",&table[n]);
    }
    return 0;
}

That's my code for this problem : http://www.spoj.pl/problems/FCTRL2/
It generates correct answers for me but when i submit it , it tells me Runtime error(segmentation fault) .
Can anyone explain to me what is the segmentation fault? cause i read it on the spoj website and i didn't understand how to avoid it and how to upgrade my code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雨轻弹 2024-08-28 13:20:21

如果将函数的返回类型从 string 替换为 void,段错误就会消失。

当您尝试读/写您无权访问的内存时,就会发生分段错误。例如,您可以尝试在只读存储器上写入,或在地址 0x00000000 处读取。实现段错误的常见方法是使用未初始化的指针。

调试器通常可以很好地帮助您查找分段错误,因为它会停止并显示发生位置。

If you replace the return type of the function multiply from string to void the segfault is gone.

A segmentation fault happens when you try to read/write memory you don't have access to. For instance you can try writing on read only memory, or reading at address 0x00000000. A common way to achieve segfaults is by using an uninitialized pointer.

A debugger is often a good help to find a segmentation fault, as it will stop and show you where is happened.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文