按字母顺序显示名称

时间:2016-02-15 13:50:20

标签: c++ visual-c++

我想创建一个程序,提示用户输入班级中的学生数量,然后循环读取多个名称。一旦读完所有的名字,它就会报告哪个学生将在该行的前面,哪个学生将在该行的末尾。你可以假设没有两个学生有相同的名字。

但我的输出程序中没有显示正确的字符串比较...

以下是我的输出。 ...请帮帮我。

Enter the number of students(1 - 25): 5
Enter the name: ali
Enter the name: hamxa
Enter the name: hassan
Enter the name: anjum
Enter the name: java
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠java ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠java
Press any key to continue . . .

以下是我的代码

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    const int size = 10;
    char name[size], largest[size], smallest[size];
    double num;

    do
    {
        cout << "Enter the number of students(1 - 25): ";
        cin >> num;
    } while (num < 1 || num > 25);

    cin.ignore();
    for (int i = 0; i < num; i++)
    {
        cout << "Enter the name: ";
        cin.getline(name, size);
        if (strcmp(name, largest) > 0)
        {
            largest[size] = name[size];
        }
        if (strcmp(name, smallest) < 0)
        {
            smallest[size] = name[size];
        }

    }

    cout << largest << " " << smallest << endl;

    return 0;
}

2 个答案:

答案 0 :(得分:0)

首先,您需要将largest[size] = name[size];更改为strcpy(largest, name);

largest[size] = name[size]没有意义,因为largest[i]等于第(i + 1)个符号,在您的情况下size = 10largest长度为10长largest[size] {1}}指向不存在的第11个符号。

strcpy将一个字符串复制到另一个字符串。

其次,您必须为smallestlargest设置默认值。因为默认情况下char[]等于某些垃圾,例如╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠

char largest[size] = "";
char smallest[size] = "zzzzzzzzz";

所以你的代码应该类似于这个

const int size = 10;
char name[size];
char largest[size] = "";
char smallest[size] = "zzzzzzzzz";
double num;

do
{
    cout << "Enter the number of students(1 - 25): ";
    cin >> num;
} while (num < 1 || num > 25);

cin.ignore();
for (int i = 0; i < num; i++)
{
    cout << "Enter the name: ";
    cin.getline(name, size);
    if (strcmp(name, largest) > 0)
    {
        strcpy(largest, name);
    }
    if (strcmp(name, smallest) < 0)
    {
        strcpy (smallest, name);
    }
}

cout << largest << " " << smallest << endl;

答案 1 :(得分:0)

对于初学者来说,将变量num声明为double类型是没有意义的。

double num;

我认为名字的数量不能只是一小部分。

最好将其声明为至少具有size_t

类型
size_t num;

字符数组largestsmallest最初未初始化。所以if语句中的这些条件也没有意义

if (strcmp(name, largest) > 0)
//...
if (strcmp(name, smallest) < 0)

你应该用“空”字符串初始化数组,或者在main for循环中复制它们。

数组没有复制赋值运算符。您必须将一个数组的元素复制到另一个数组中。对于包含字符串的字符数组,您可以使用标准C函数strcpy

这些陈述

largest[size] = name[size];
smallest[size] = name[size];

尝试将一个数组中不存在的元素分配给另一个数组。它们不会将字符串从一个数组复制到另一个数组中。

程序可以通过以下方式查找

#include <iostream>
#include <cstring>

int main()
{
    const size_t SIZE = 10;
    char name[SIZE], largest[SIZE], smallest[SIZE];
    size_t num;

    do
    {
        std::cout << "Enter the number of students(1 - 25): ";
        std::cin >> num;
    } while (num < 1 || num > 25);

    std::cin.ignore();

    for ( size_t i = 0; i < num; i++ )
    {
        std::cout << "Enter the name: ";
        std::cin.getline( name, SIZE );

        if ( i == 0 )
        {
            std::strcpy( largest, name );
            std::strcpy( smallest, name );
        }
        else if ( std::strcmp( largest, name ) < 0 )
        {
            std::strcpy( largest, name );
        }
        else if ( std::strcmp( name, smallest ) < 0 )
        {
            std::strcpy( smallest, name );
        }
    }

    std::cout << largest << " " << smallest << std::endl;

    return 0;
}    

它的输出可能看起来像

Enter the number of students(1 - 25): 5
Enter the name: ali
Enter the name: hamxa
Enter the name: hassan
Enter the name: anjum
Enter the name: java
java ali