ideone.com上的SIGXFSZ?

时间:2011-08-23 01:19:01

标签: c++

我想以字符串的形式按升序打印重复的字符。此代码编译但在{c}编译器上没有输出SIGXFSZ运行时错误...任何建议?

#include <iostream>
#include <string.h>
#include <ctype.h>

using namespace std;

int main()
{
  unsigned int i;
  char str[26];
  int a[26];
  for(i=0;i<26;i++)
    a[i]=0;
A:
  i=0;
  cout<<"Enter the string:";
  cin>>str[i];

  while(str[i]!=13)
  {
    if(isalpha(str[i]))
      i++;
    else{
      cout<<"Invalid string";
      goto A;
    }
  }

  cout<<"You Enterd:"<<str;

  for(i=0;i<strlen(str);i++)
    ++a[str[i]-97];

  cout<<"\nLetters Frequency:";

  for(i=0;i<26;i++)
    cout<<a[i]<<" ";

  cout<<"\nDuplicates in sorted order:";

  for(i=0;i<26;i++)
  {
    if(a[i]>1)
      cout<<char(i+97);
  }

  return 0;
}

2 个答案:

答案 0 :(得分:2)

问题1

char str[26];
//..
cout<<"Enter the string:";
// should be cin >> str if you want to input a string,
// cin >> str[i] is used to input a single character only.
cin>>str[i];

问题2

// should be while(str[i]!='\0')
// because a C-style string is terminated with '\0'.
while(str[i]!=13)
{
  if(isalpha(str[i]))
    i++;
  else{
     cout<<"Invalid string";
     goto A;
  }
}

问题3

不习惯goto 。在大多数情况下,它不被认为是一种好的编程风格,因为它会使您的代码变得不必要地复杂,难以阅读。

您可以使用以下循环替换goto

bool isInvalid = true;
while (isInvalid)
{
  // read input
  // while-loop validating the input

  if (str[i] == '\0') isInvalid = false;
}

答案 1 :(得分:1)

如果您没有使用有效输入结束输入,则会在ideone上获得SIGXFSZ,因为您将尝试读取比cin上提供的数据更多的数据。这是一个working run

除此之外,我修正了其他一些错误:首先,Eric Z指出的cin >> str[i]。此外,您的while(str[i]!=13)应为while(str[i]!=0)