求解决PTA段错误问题

C语言题目
做pta的题目,出现段错误
请问如何解决啊

img

img

#include <stdio.h>
int main()
{
    struct stuff 
    {
        char name[11];
        float basic;
        float flo;
        float paying;
        float ture;     
    }s[20];
    int i,num;
    scanf("%d",&num);
    for(i=0;i<num;i++)
    {
        scanf("%s%f%f%f",s[i].name,&s[i].basic,&s[i].flo,&s[i].paying);
        s[i].ture=s[i].basic+s[i].flo-s[i].paying;
    }
    for (i=0;i<num;i++)
    {
        if(num==1)
        printf("%s %.2f\n",s[i].name,s[i].ture);
        else
        {        
        if(i<num-1)
    printf("%s %.2f\n",s[i].name,s[i].ture);
         if(i==num-1)
    printf("%s %.2f",s[i].name,s[i].ture);
    }
    }
}

这样改试试,供参考:

#include <stdio.h>
struct stuff
{
    char  name[11];
    float basic;
    float flo;
    float paying;
    float ture;
}s[20];
int main()
{
    int i,num;
    scanf("%d",&num);
    for(i=0;i<num;i++)
    {
        scanf("%s%f%f%f",s[i].name,&s[i].basic,&s[i].flo,&s[i].paying);
        s[i].ture=s[i].basic+s[i].flo-s[i].paying;
    }
    for (i=0;i<num;i++)
    {
        //if(num==1)
        //printf("%s %.2f\n",s[i].name,s[i].ture);
        //else
        //{
        //if(i<num-1)
        //printf("%s %.2f\n",s[i].name,s[i].ture);
        // if(i==num-1)
        if (i)  printf("\n");
        printf("%s %.2f",s[i].name,s[i].ture);
    }
    //}
    return 0;
}


结构体的定义与使用有问题,给你修改了程序如下所示:
亲下次提问题,把代码粘贴上咯,打一段代码挺耗时间的。
如有疑问,可以私聊。

#include <stdio.h>

typedef struct stuff
{
    char name[11];
    float basic;
    float flo;
    float paying;
    float ture;
}stuff_struct;

int main()
{
    stuff_struct s[20];
    int i,num;
    scanf("%d",&num);
    for(i=0;i<num;i++)
    {
        scanf("%s%f%f%f",s[i].name,&s[i].basic,&s[i].flo,&s[i].paying);
        s[i].ture=s[i].basic+s[i].flo-s[i].paying;
    }

    for(i=0;i<num;i++)
    {
        if(num==1)
            printf("%s %.2f\n",s[i].name,s[i].ture);
        else
        {
            if(i<num-1)
                printf("%s %.2f\n",s[i].name,s[i].ture);
            if(i==num-1)
                printf("%s %.2f\n",s[i].name,s[i].ture);
        }
    }
}

供参考

img

#include <stdio.h>
int main(void)
{
    typedef struct stuff
    {
        char name[11];
        float basic;
        float flo;
        float paying;
        float ture;
    };

    int i, num;

    scanf("%d", &num);
    if (num <= 0)
        return -1;
    stuff s[num];

    for (i = 0; i < num; i++)
    {
        scanf("%10s%f%f%f", s[i].name, &s[i].basic, &s[i].flo, &s[i].paying);
        s[i].ture = s[i].basic + s[i].flo - s[i].paying;
    }

    for (i = 0; i < num; i++)
    {
        if (i < num - 1)
            printf("%s %.2f\n", s[i].name, s[i].ture);
        else
            printf("%s %.2f", s[i].name, s[i].ture);
    }
}


  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7581338
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言 PTA 正整数的各位数字之和是否为质数
  • 除此之外, 这篇博客: 【PTA】【C语言】复盘练习——函数题中的 裁判测试程序样例: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 
    #include <stdio.h>
    void F(int n);
    int main()
    {
        int n;
        scanf("%d", &n);
        F(n);
        return 0;
    }
    /* 请在这里填写答案 */
    

     代码如下:

    
    #include <stdio.h>
    void F(int n);
    int main()
    {
        int n;
        scanf("%d", &n);
        F(n);
        return 0;
    }
    /* 请在这里填写答案 */
    
    22
    

    两个数之间空格隔开,最后一个数后面没有空格:

    22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
    

    代码长度限制        16 KB

    时间限制        400 ms

    内存限制        64 MB

    代码如下:

    void F(int n)
    {
        printf("%d", n);
        if (n != 1)
            printf(" ");
    	int i = n;
    	while(i != 1) 
        {
    		if(i % 2 == 0 && i >= 0)
            {	
    			i = i / 2;
    			printf("%d", i);
    		}
    		else if(i % 2 != 0 && i >= 0)
            {
    			i = i * 3 + 1;
    			printf("%d", i);
    		}
            if (i != 1)
                printf(" ");
    	}
     } 
    

    本题要求实现一个函数,删除单链表的第i个结点。

    Node *deletelink(Node *head, int i)
    

    在这里,head是单链表的头指针,i是待删除的结点编号。函数不需要处理单链表为空的情况。如果删除位置错误,输出"error"。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct ListNode {
        int num;
        struct ListNode *next;
    }Node;
    
    Node *createlist(); /*根据用户输入的整数n,创建具有n个结点的单链表。裁判实现,细节不表*/
    Node *deletelink(Node *head, int i);
    void display(Node *head);/*输出链表结点的数据域。裁判实现,细节不表*/
    
    int main(void)
    {
        Node  *head;
         int i;
        head = createlist();
         scanf("%d",&i);
        head = deletelink(head, i);
        display(head);
        return 0;
    }
    
    /* 请在这里填写答案 */
    
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    在C语言程序中,出现段错误通常是访问了没有分配到的内存,或者访问了越界的数组元素等原因,解决该问题可以采用以下方法:

    1. 在程序开头加上头文件,即可使用该头文件中的NULL指针,当指针变量没有被分配到内存时,将它赋值为NULL,并在程序中添加相应的语句进行检查和处理。

    2. 在使用malloc函数时,应该明确分配的内存大小,以免分配过大的空间而导致程序出错。

    3. 在使用指针变量时,应该注意访问合法的地址,不要写成"(p+1)",应该写成"(p+i)"。

    4. 在数组下标访问时,应该注意下标是否越界,这是程序出现段错误最常见的原因。可以使用"sizeof"和"strlen"等函数来检查数组的长度,避免越界。

    以下是对参考资料中提供的三个题目的解答:

    1. PTA C语言题目出现段错误的问题

    段错误通常由指针访问空/野指针或者数组越界引起,对于该问题,可以通过以下方法避免和解决:

    1. 尽量不使用指针,或者在使用指针时判断常量、指针是否为空。

    2. 定义数组时,需要根据数据规模选择合适的空间,避免越界访问。

    3. 在使用C库函数时,要注意其使用方法和返回值,避免出现不必要的错误。

    4. 在开发过程中,要注重调试,及时发现和解决问题,避免程序实现中可能存在的错误。

    代码实现:

    该问题解决方法较为常规,没有具体的代码实现。

    1. 求某数序列中区间的最大和

    该问题为一个常见的算法问题,可以通过以下步骤求解:

    1. 以循环遍历的方式依次遍历所有可能的区间,求出每个区间的和,记录最大和对应的区间。

    2. 在遍历当前区间时,使用变量sum记录当前的区间和,变量max_sum记录当前的最大值,如果sum小于0,则抛弃当前区间。

    代码实现:

    void fun(int a[N],int number) { int i,j; int max_sum = a[0], sum = 0, max_i, max_j; for(i = 0;i < N;i++){ sum = 0; for(j = i;j < N;j++){ sum += a[j]; if(sum > max_sum){ max_sum = sum; max_i = i; //记录最大值区间的起始位置 max_j = j; //记录最大值区间的结束位置 } } } printf("The max sum is:%d\n", max_sum); printf("The interval is from %d to %d\n", max_i, max_j); }

    1. 圆的周长和面积

    该问题可以通过公式计算圆的周长和面积,具体实现步骤如下:

    1. 定义常量PI,表示圆周率,其值为3.14159。

    2. 根据给定半径,计算圆的周长和面积,并将结果存储到变量v和s中。

    3. 输出v和s的值。

    代码实现:

    double f(double r, double p){ p = 2 * PI * r; return PI * r * r; }

    int main(){ double r, v, s; scanf("%lf", &r); s = f(r, &v);

    printf("The circle area is: %.2lf\n", s);
    printf("The circle perimeter is: %.2lf\n", v);
    
    return 0;
    

    }