如何避免在C语言中出现这种分割错误?

时间:2018-07-10 10:49:04

标签: c segmentation-fault

我正在尝试通过使用空格将字符串与字符串分开,但是不幸的是我在C中遇到了段错误错误。但是,当您使用空格传递字符串时,它工作得很好,例如“ Hello World”,但当我传递带有两个空格(即“ h e r”)的字符串时不起作用。

我不明白我哪里错了。

#include<stdio.h>
#include<string.h>
char* yoda(char n1[20])
{
    int i,j,t=0,k=2,len,c=0;
    len=strlen(n1);
    char n2[20];
    char* n3[20];
    for(i=0;i<len;i++)
    {
        if(n1[i]==' ')
        c++;
    }
    for(i=0;i<c+1;i++)
    {
        for(j=0;j<len;j++)
        {
            if(k==0)
            {
                if(n1[t+1]==' ')
                {

                    t++;
                    break;
                }
                else
                {
                    n2[j]=n1[t+1];  
                    t++;
                }
            }
            else if(n1[j]==' ')
            {
                t=j;
                k=0;
                break;  
            }
            else
            {
                k=1;
                n2[j]=n1[j];
            }
        }
        strcpy(n3[i],n2);
    }
    for(i=0;i<c+1;i++)
    {
        //for(j=0;j<len;j++)
        {
            printf("\n%s",n3[i]);
        }
    }
}
void main()
{
    int i,j,k;
    char sen[20],res[20];
    scanf("%[^\n]s",sen);
    //printf("%s",
    yoda(sen);
}

1 个答案:

答案 0 :(得分:2)

由于未为char *n3[20];分配内存,因此发生了分段错误。 在语句strcpy(n3[i],n2);中,n3[i]未分配给任何内存空间。您必须使用动态内存分配为n3[i]动态分配内存。

也可以将您的条件i<c+1替换为更简单的条件i<=c;。您的代码中for-loops太多,导致代码不可读。您还没有从char* yoda(char n1[20]);返回任何值。您忘记了在\0之前使用n2来表示字符串结尾strcpy(n3[i],n2);

我有re-writtenfor-loops小写的代码。试试这个:-

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *yoda(char *n1)        // modified function.
{
    int i, j, k, c = 0;
    char n2[20];
    char *n3[20];

    for (j = 0, k = 0;; j++)
    {
        if (n1[j] != ' ' && n1[j] != '\0')
        {
            n2[k++] = n1[j];
        }
        else
        {
            n2[k] = '\0';
            n3[c] = (char *)malloc(sizeof(n2)); // dynamic memory allocation
            strcpy(n3[c], n2);
            c++;
            k = 0;
        }

        if (n1[j] == '\0')
        {
            break;
        }
    }
    for (i = 0; i < c; i++)
    {
        {
            printf("\n%s", n3[i]);
        }
    }
}
int main()
{
    int i, j, k;
    char sen[20], res[20];
    scanf("%[^\n]s", sen);
    //printf("%s",
    yoda(sen);

    return 0;
}

输出:-

I Love you C

I
Love
you
C