Автозаполняет мусор
Программа должна иметь 4 типа различного заполнения списка структур (1 – ввод с экрана, 2 – случайным образом), а также действия над структурами (3 – сортировка, 4 – печать). Для этого я сделал многофайловый проект, всё работает, но вот неудача - когда я выбираю "Автоматически", то в первом столбце, где надо выводить одну заглавную букву, после вылазит мусор. Код прикладываю ниже.
qa.h :
#pragma once
#include <iostream>
#include "qw.h"
using namespace std;
void zapoln(int rows,mon[]);
void random(int rows, mon[]);
void sort(int rows, mon[]);
void display(int rows,mon[]);
qa.cpp :
#include "qw.h"
#include "qa.h"
#include <iostream>
using namespace std;
#define N 27
void zapoln(int rows,mon mm[])
{
int ne;
double sqx;
for (ne = 0; ne < rows; ne++) {
printf("%d. Введите: название, школу, количество, площадь >",ne + 1);
scanf_s("%s", mm[ne].name, sizeof(mm[ne].name));
if (!strcmp(mm[ne].name, "***")) break;
scanf_s("%f", &mm[ne].sc, sizeof(mm[ne].name));
scanf_s("%f", &mm[ne].cnt);
scanf_s("%lf", &sqx); mm[ne].sq = sqx;
}
}
void random(int rows,mon mm[]) {
char t[] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U',
'V','W','X','Y','Z' };
for (int i = 0;i < rows;i++)
{
*mm[i].name = t[rand() %19];
mm[i].sc = (rand() % 78432) / 10.0;
mm[i].cnt = (rand() % 133315) / 10.0;
mm[i].sq = rand() % 94578678 + 10000000;
}
}
void sort(int rows, mon mm[]) {
int m;
struct mon xy;
for (int i = 0; i < rows; i++) {
m = i;
for (int j = i + 1; j < rows; j++)
if (strcmp(mm[m].name, mm[j].name) > 0) m = j;
if (m > i) {
xy = mm[i];
mm[i] = mm[m];
mm[m] = xy;
}
}
}
void display(int rows,mon mm[]) {
#ifdef DEBUG
cout << __FUNCTION__ << " " << __DATE__ << endl;
#endif // DEBUG
printf("----------------------------------------------------------------------------------\n");
printf("|Приблизительное количество звезд разных спектральных классов в Галактике |\n");
printf("|--------------------------------------------------------------------------------|\n");
printf("| Спектральный класс | Приблизительная масса |Часть | Численность |\n");
printf("| | (отн.Солнца) | в впроцентах | |\n");
printf("|---------------------|-------------------------|--------------|-----------------|\n");
for (int i = 0; i < rows; i++)
printf("| %-19s | %-20.2f | %-12.2f | %-15.2lf |\n",
mm[i].name, mm[i].sc, mm[i].cnt, mm[i].sq);
printf("---------------------------------------------------------------------------------\n");
}
qw.h :
#pragma once
#define N 27
#ifndef _QA_H_
#define _QA_H_
struct mon {
char name[45];
float sc;
float cnt;
double sq;
};
#endif
main.cpp :
#include <ctime>
using namespace std;
#define N 27
#include "qw.h"
#include "qa.h"
int main() {
srand(time(NULL));
mon mm[45];
setlocale(LC_ALL, "ru");
int rows;
std::system("chcp 1251");
/* O 32 0,00002 55000
F 1,25 2,9 12000000000 Данные
M 0,2 73,2 293000000000
*/
int answer, answer2;
cout << "Сколько строк вы хотите, чтобы было в таблице: " << endl;
cin >> rows;
cout << "Введите, что выбрать: 1 - Ручное заполнение," << endl;
cout << "\t\t\t 2 - Автоматическое." << endl;
cin >> answer;
if (answer == 1) {
cout << "Вы выбрали вариант номер " << answer << endl << endl;
zapoln(rows,mm);
}
else if (answer == 2) {
cout << "Вы выбрали вариант номер " << answer << endl << endl;
random(rows, mm);
}
cout << "Теперь введите действия над печатями: 3 - Сортировка," << endl;
cout << "\t\t\t 4 - Печать." << endl;
cin >> answer2;
if (answer2 == 3) {
cout << "Вы выбрали вариант номер " << answer2 << endl << endl;
sort(rows,mm);
display(rows,mm);
}
else if (answer2 == 4) {
cout << "Вы выбрали вариант номер " << answer2 << endl << endl;
display(rows,mm);
}
return 0;
}
Вот скрин того, что выводит.
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
*mm[i].name = t[rand() %19];
А завершающий строку нолик кто будет писать?...
*(mm[i].name+1) = '\0';
или просто
*(mm[i].name+1) = 0;
Строка в стиле С - это массив символов, признаком конца строки при этом является нулевой символ (не символ нуля, а именно нулевой :))
