我的程序工作正常,但有一个奇怪的错误......输入的最后一行不能为空,否则会抛出错误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';
}
答案 0 :(得分:0)
我在上面的代码中看到的一个问题是你有一个最大长度为1000的字符串数组,你使用临时数组来交换它们,但是临时数组的大小为25,你可能会尝试将长度为1000的字符串复制到其中会导致缓冲区溢出。
tmp[25];
应该是
tmp[LEN];
如果输入中的至少一个字符串超过23个字符('\0'
和'\n'
减去2,则当您将其中一个长字符串复制到{时,您的程序可能会出现未定义的行为{1}}。