获取错误分段错误

时间:2014-02-13 22:32:26

标签: c data-structures error-handling

我的程序工作正常,但有一个奇怪的错误......输入的最后一行不能为空,否则会抛出错误Segmentation fault(core dumped)...知道为什么会发生这种情况吗?

这是我的代码:

#include<stdlib.h>
#include <stdio.h>
#include <string.h>
#define NUM 25
#define LEN 1000
int stringCompare(char str1[],char str2[]);
void stringCopy(char str1[],char str2[]);

int main()
{
    char tmp[25];
    int i=0,j=0;
    char Strings[NUM][LEN];

    printf("enter %d strings, one at a time:\n", NUM);

    for(i=0;i<NUM;++i)
    {
        printf("String %d : ",(i+1));
        fgets(Strings[i],LEN-2,stdin);
    }

    puts("these are the strings you entered:");

    for(i=0;i<NUM;++i)
    {
        printf("%s",Strings[i]);
    }

    for(i=1;i<NUM;i++)
    {
        for(j=0;j<NUM-1;j++)
        {
            if(stringCompare(Strings[j],Strings[j+1]) > 0)
            {
                stringCopy(tmp,Strings[j]);
                stringCopy(Strings[j],Strings[j+1]);
                stringCopy(Strings[j+1],tmp);
            }
        }
    }

    /* Output sorted list */
    puts("These are the strings alphabetical order:");
    for(i=0;i<NUM;i++)
    {
        printf("%s",Strings[i]);
    }
    return 0;
}

int stringCompare(char str1[],char str2[]){
    int i=0,flag=0;
    while(str1[i]!='\0' && str2[i]!='\0')
    {
        if(str1[i]!=str2[i]){
            return str1[i] - str2[i];
        }
        i++;
    }
    return 0;
}

void stringCopy(char str1[],char str2[]){
    int i=0;
    while(str2[i]!='\0'){
        str1[i] = str2[i];
        i++;
    }

    str1[i]='\0';
}

1 个答案:

答案 0 :(得分:0)

我在上面的代码中看到的一个问题是你有一个最大长度为1000的字符串数组,你使用临时数组来交换它们,但是临时数组的大小为25,你可能会尝试将长度为1000的字符串复制到其中会导致缓冲区溢出。

tmp[25];

应该是

tmp[LEN];

如果输入中的至少一个字符串超过23个字符('\0''\n'减去2,则当您将其中一个长字符串复制到{时,您的程序可能会出现未定义的行为{1}}。