标题:请问代码里runtime error显示SIGSEGV该怎么办
只看楼主
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
结帖率:96.88%
已结贴  问题点数:10 回复次数:6 
请问代码里runtime error显示SIGSEGV该怎么办
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int finding(char a[],char b[])
{   char c[100]={0},d[200000]={0};
int flag=0;
int k;
  for(int i=0;i<strlen(a);i++)
    c[i]=toupper(a[i]);
   for(int i=0;i<strlen(b);i++)
    {if(b[i]==' ')
        d[i]=b[i];
    else
        d[i]=toupper(b[i]);}
        if((strlen(c)==strlen(d))&&(strcmp(c,d)==0))
           {
               printf("1");
               return 0;
           }
   else{for(int i=0;i<strlen(d);i++)
    {    if(strncmp(d,c,strlen(c))==0&&d[strlen(c)]==' ')
    {
        flag=1;
        k=0;
        break;
    }
       else {if(i+strlen(c)!=strlen(d))
             {if((strncmp(d+i,c,strlen(c))==0)&&(d[i-1]==' ')&&d[i+strlen(c)]==' ')
        {
            flag=1;
            k=i;
            break;
        }}
        else {if((strncmp(d+i,c,strlen(c))==0)&&(d[i-1]==' '))
        {
            flag=1;
            k=i;
            break;
        }
}}}}
    if(flag==0) {printf("None");
    return 0;}
    else printf("%d",k+1);
    return 0;
}
void main()
{
    int cnt;
    scanf("%d ",&cnt);
    for(int i=0;i<cnt;i++)
    {
        char a[100],b[200000];
        gets(a);
        gets(b);
        printf("case #%d:\n",i);
        finding(a,b);
        printf("\n");
    }
}





//我想用字符串写,先把数组全部换成大写字母,然后再考虑开头结尾空格的情况
//但是好难,后面还有四十多个测试点
搜索更多相关主题的帖子: flag int if printf strlen 
2020-03-19 13:30
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
题目:有一个单词 W,输出它在字符串 S 中从左到右第一次出现的位置 IDX(设 S 中的第 1 个字符的位置为 1)。W 只由英文字母组成,S 除英文字母和汉字之外在任何位置(包括头和尾)另有一个或多个连续的空格。

查找单词时,不区分大小写,但要求完全匹配,即单词 W 必须与 S 中的某一独立单词在不区分大小写的情况下完全匹配。W 仅是 S 中某一单词的一部分就不算匹配。
输入格式

第 1 行:一个整数 T (1≤T≤10) 为问题数。

接下来共 2T 行,对应每个问题有 2 行,表示 W 和 S (1≤W长度≤10;1≤S长度≤1000000)。
输出格式

对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。

然后对应每个问题在一行中输出 IDX。
S 中没有找到 W 时输出 None。
样例
Input

3
IN
Find a word within a string in English and in Chinese.
to
    Find a word within a string in English and in Chinese.
In
    Find a word within a string in English and in Chinese.

Output

case #0:
29
case #1:
None
case #2:
33


我想要两颗西柚。
2020-03-19 13:31
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:8 
程序代码:
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int finding(char a[],int size_a,char b[],int size_b)
{
    char c[size_a+1],d[size_b+1];
    char *ret,*temp;
    int pp;

    if(size_a>size_b)
        return 0;

    for(int i=0; i<size_a; i++)
        c[i]=toupper(a[i]);
    c[size_a]=' ';
    for(int i=0; i<size_b; i++)
    {
        if(b[i]==' ')
            d[i]=b[i];
        else
            d[i]=toupper(b[i]);
    }
    d[size_b]=' ';

    temp=d;
    while(1)
    {
        if((ret=strstr(temp,c))!=0)
        {
            //三种尺寸可能
            if((size_a==size_b)||
               (ret==d&&((ret+size_a)==' '||(ret+size_a)=='.'))||
               (*(ret-1)==' '&&(*(ret+size_a)==' '||*(ret+size_a)=='.')))
            {
                return (ret-d+1);
            }
            temp=ret+1;
        }
        else
            return 0;
    }
}

void main()
{
    int cnt,num[11];
    char a[11],b[1000001];
    scanf("%d ",&cnt);
    for(int i=0; i<cnt; i++)
    {
        gets(a);
        gets(b);
        num[i]=finding(a,strlen(a),b,strlen(b));
    }

    for(int i=0; i<cnt; i++)
    {
        printf("case #%d:\n",i);
        if(num[i]==0)
            printf("None\n");
        else
            printf("%d\n",num[i]);
    }
}

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-03-19 16:27
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:2 
段错误
常见的原因
一是野指针,你这个不像
二是数组超界。
看了一下,题目里面说大串长度上限百万,楼主你偏要使用二十万的数组,不知意欲何为呀?
我是说,你不越界谁越界呢?

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-03-19 19:03
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
回复 3楼 纯蓝之刃
谢谢!

我想要两颗西柚。
2020-03-20 00:01
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
得分:0 
回复 4楼 forever74
数0数错了..改了之后在第12点变成time limited了,很难过,不过还是谢谢!

我想要两颗西柚。
2020-03-20 00:02
纯蓝之刃
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:76
帖 子:554
专家分:3690
注 册:2019-7-29
得分:0 
你这个最大的问题不是计算部分,而是不能finding(a,b);把数组指针传到子函数里使用strlen去求得长度的,你求得的长度不一定是你a,b字符串的长度,而是从地址a开始直到第一个空字符长度长度。

一沙一世界,一花一天堂。无限掌中置,刹那成永恒。
2020-03-20 08:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-500432-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.580693 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved