我想以字符串的形式按升序打印重复的字符。此代码编译但在{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;
}
答案 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)
。