此代码没有给出任何语法错误但是有一些逻辑错误,我无法找到它。 守则是:
#include<iostream>
#include<cstring>
void SortString(std::string str, int size)
{
int min;
for(int i = 0; i < size-2; i++)
{
min = i;
for(int j = i+1; j < size-2; j++)
{
if( str[j] < str[min] )
min = j;
}
char temp = str[i];
str[i] = str[min];
str[min] = temp;
}
std::cout<<std::endl<<str<<std::endl;
}
int main()
{
std::string str;
std::cout<<"\n Enter a string to sort : ";
std::getline(std::cin, str);
std::cout<<"\n String after sorting is : \n";
SortString(str, strlen(str.c_str()));;
//std::cout<<str<<std::endl;
return 0;
}
很少有输出实例:
1。 输入要排序的字符串:lovely
String after sorting is :
elovly
2
Enter a string to sort : program
String after sorting is :
goprram
这个逻辑适用于整数数组的排序。但它不适用于字符串。
答案 0 :(得分:3)
要注意的关键是,如果你看看你的两个例子:
lovely ==>
elovly
program ==>
goprram
它看起来像什么?对我而言,除了最后的两个字符外,它看起来都在排序。
你的循环边界是什么样的?
for(int i = 0; i < size-2; i++)
{
min = i;
for(int j = i+1; j < size-2; j++)
你正在跳过最后两个角色!将界限更改为size
。
std::string
知道自己的大小,有一个成员函数:size()
(或length()
)。所以你不需要strlen()
。然后SortString()
实际上对字符串进行复制并在内部对其进行排序,如果您通过引用对其进行排序,将会更有用。最后,存在std::swap()
:
void SortString(std::string& str)
{
int min;
for(int i = 0; i < str.size(); i++)
{
min = i;
for(int j = i+1; j < str.size(); j++)
{
if( str[j] < str[min] )
min = j;
}
std::swap(str[i], str[min]);
}
}
答案 1 :(得分:0)
为什么你算到大小 - 2?这样你就不会看到最后两个字符
答案 2 :(得分:0)
首先,声明第二个参数没有多大意义,因为std::string
类型的对象会在其自身内部保留有关其大小的信息。
外循环中的这种情况
for(int i = 0; i < size-2; i++)
^^^^^^^^^^
错了。例如,如果字符串只有两个字符,如"BA"
,则很明显size
等于2
,循环将永远不会迭代。也就是说,不会交换字符来获取排序后的字符串"AB"
。
该功能可以按以下方式编写
void SortString( std::string str )
{
for ( std::string::size_type i = 0; i < str.size(); i++ )
{
std::string::size_type min = i;
for ( std::string::size_type j = i + 1; j < str.size(); j++ )
{
if ( str[j] < str[min] ) min = j;
}
if ( i != min ) std::swap( str[i], str[min] );
}
std::cout << std::endl << str << std::endl;
}