请在这里帮助我....下面给出的程序显示分段错误....我不知道它有什么问题..
Runtime Error: SEG
Description: Segmentation fault
Runtime: 0.1
(程序运行时总会显示......)
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
int main()
{
char sent[1000][80],reqd[1000][80],temp[80];
unsigned int i,j,k=0,l=0,n,num=0;
cin>>n;
for(i=0; i<n; i++)
{
cin.getline(sent[i],80);
}
for(j=0; j<n; j++)
{
for(i=0; i<strlen(sent[j]); i++)
{
while(sent[j][i]!=' '&&sent[j][i]!='\0')
{
reqd[l][k]=sent[j][i];
i++;
k++;
}
reqd[l][k]='\0';
l++;
k=0;
}
}
for(i=0; i<=l; i++)
{
for(j=0; j<l-i-1; j++)
{
if(strcmp(reqd[j],reqd[j+1])>0)
{
strcpy(temp,reqd[j+1]);
strcpy(reqd[j+1],reqd[j]);
strcpy(reqd[j],temp);
}
}
}
num=l;
for(i=0; i<l; i++)
{
if(strcmp(reqd[i],reqd[i+1])==0)
{
reqd[i][0]=' ';
num--;
}
}
cout<<num<<"\n";
for(i=0; i<l; i++)
{
if(reqd[i][0]!=' ')
{
cout<<reqd[i]<<"\n";
}
}
return 0;
}
请帮我找到问题....
答案 0 :(得分:2)
每当你在C / C ++中看到一个分段错误时,你应该首先考虑指针问题(或等效的数组问题。)在这种情况下,我是一个超出你的字符数组长度的美元,因为你把它当作一个字符串处理,但读取的字符串大小与你的字符串长度相同。请记住,由于终结符字符,C字符串总是比字符串长度多一个字节。
答案 1 :(得分:2)
可能是由于cin.getline(sent[i],80);
,您没有考虑空字符。
答案 2 :(得分:2)
崩溃的直接原因是这个循环:
for(i=0; i<=l; i++)
{
for(j=0; j<l-i-1; j++)
在上一次迭代中,l-i-1
的值应为-1
;但是,由于这些是无符号的,因此结果会回绕到一个非常大的正值,并且循环永远不会退出。相反,它会通过内存直到达到无效地址并崩溃。
一些可能的修复方法是:
int
j+1<l-i
j<l-i
期间从1循环,并更改循环以将sent[j-1]
与sent[j]
进行比较。另外,如果您读取的初始号码本身应该在一行上,那么您需要在阅读之后致电cin.ignore()
;否则,你会得到一个不需要的空行作为你的第一个输入。
但是如果您打算使用C ++,我建议您学习如何使用标准库,特别是std::string
等类,std::vector
等容器,以及{{{}等算法。 1}}。使用C风格的字符串和固定长度的缓冲区搞乱会导致像这样的错误。
这样的事情可以做同样的事情,但错误的范围更小:
std::sort
答案 3 :(得分:1)
不要混用
cin >> variable;
与
cin.getline()
cin不会删除新行,因此稍后您的getline会读取它。
而不是
cin.getline(sent[i],80);
尝试
cin >> sent[i];