Задание требует, чтобы я собрал имя с 2 scanf's
Итак, вот мой первый вопрос по компьютерному программированию для ультра начинающих в C.
Мне нужно настроить его так, чтобы кто-то мог ввести свое полное имя на входе. Вот часть спецификации -
"Вам нужно будет немного подумать, чтобы выяснить, как выровнять напечатанные имена со всеми остальными столбцами. Первый намек - это объединение строк, что-то называемое конкатенацией. не могу понять это, посмотрите на следующий документ в этой папке, он содержит дополнительные подсказки. Часть назначения этого задания состоит в том, чтобы неявно обучить вас конкатенации. НЕ используйте вкладки (\t) и убедитесь, что ваш C/C++ Редактор не выводит символы табуляции.
НЕ используйте get () в этой программе. Используйте scanf() для ввода интерактивной информации. Если вы попытаетесь использовать gets(), вы можете ОЧЕНЬ расстроиться.
По сути, все цифры в отчете должны быть выровнены по правому краю и выровнены по десятичной дроби. Все числа, фигурирующие в сводке, должны появляться без начальных пробелов (кроме тех, которые обычно отделяют число от предыдущего слова). Размер почасовой заработной платы МОЖЕТ быть менее 10,00, поэтому будьте очень осторожны с форматированием. Пример выходных данных может показаться правильным, но вы все равно можете быть пристыкованы на пол-очка, если вещи не соответствуют должному уровню почасовой заработной платы ниже 10,00 долларов США."Дополнительные подсказки:
Вы можете предположить, что имя сотрудника - это всегда два имени, имя и фамилия, разделенные пробелом. Также предположим, что внутри имени или фамилии никогда не должно быть пробелов. Это позволяет вам использовать два вызова scanf() вместо одного вызова gets (). get () привнесет некоторые странности, которые заставляют вещи работать некорректно в дальнейшем.
Вы также можете предположить, что ни одно из имен не превышает 10 символов в длину.
Ввод из процесса другого сотрудника? Вопрос должен быть один символ. Предположим, что N или n остановит цикл, но любой другой символ продолжит цикл.
Кто-нибудь знает, как это сделать? Когда я использую get (что он говорит, чтобы не делать), цикл обворачивается во второй раз, и он запрашивает имя и зарплату все в одной строке. И если я пытаюсь использовать 2 оператора scanf, я получаю сбой или только 1 из введенных имён.
Я думал, что единственный способ сделать это - вывести имена в текстовый файл, а затем снова прочитать их. Но есть ли другой способ? Мне не разрешено спрашивать имена по отдельности. Пользователь может ввести полное имя с одним пробелом, как сказано в спецификации.
Вот код, который я написал до сих пор. Мне также нужны итоги для всех брутто, сверхурочных и обычных часов.
//stupid program
#include <stdio.h>
#include <strings.h>
#include <math.h>
//global variables
FILE *reportfile; //output file
char department[21];
int count;
char name[21];
float hoursworked;
float hourlywage;
float overtimehoursworked;
float overtimehourlywage;
float gross;
char again;
char firstname;
char lastname;
float tothoursworked;
float totovertimehoursworked;
float totgross;
const float overtimerate = 1.5;
const float overtimethreshold = 40; //hours needed to get overtime
//function prototypes
void GetInfo(void);
void Finalreport(void);
//main
int main(void)
{
reportfile = fopen("c:\\class\\kpaul-pay.txt","w"); //open output file
//////////////////////////////////////////////////
// initialize accumulating variables
/////////////////////////////////////////////////
count = 0;
tothoursworked = 0;
totovertimehoursworked = 0;
totgross = 0;
GetInfo();
fclose(reportfile); //close output file
return 0;
}
void GetInfo (void)
{
printf("Mountain Pacific Corporation\n");
printf("Department Salary Program\n\n");
printf("Please enter the name of the department: ");
gets(department);
fprintf(reportfile, "Mountain Pacific Corporation\n");
fprintf(reportfile, "Department Salary Program\n\n");
fprintf(reportfile, "%s\n\n", department);
fprintf(reportfile, "Employee Reg Hrs Overtime Hrs Gross\n");
fprintf(reportfile, "-----------------------------------------------------------------\n");
do {
printf("\nEnter employee #1: ");
gets(name);
printf("Enter the hourly wage of %s", name);
scanf("%f", &hourlywage);
printf("\nEnter total number of hours: ");
scanf("%f", &hoursworked);
if (hoursworked<=overtimethreshold)
overtimehoursworked = 0;
else if (hoursworked > overtimethreshold)
overtimehoursworked = hoursworked - overtimethreshold;
gross = (hoursworked*hourlywage) + (overtimehoursworked*overtimehourlywage);
fprintf(reportfile, "%s%16.2f(%4.2f)%12.2f(%4.2f) $%7.2f", name, hoursworked, hourlywage, overtimehoursworked, hourlywage * overtimerate, gross);
tothoursworked = tothoursworked + hoursworked;
totovertimehoursworked = totovertimehoursworked +overtimehoursworked;
totgross = totgross + gross;
printf("\n");
printf("Would you like another conversion? ");
scanf ("%s", &again);
printf("\n\n");
} while (again!='N' && again!='n');
}
2 ответа
Тщательное использование scanf
Строка формата необходима. %s
указывает на строку, разделенную пробелом, в нетехнических терминах, scanf
будет читать символы, пока не найдет символ пробела, такой как табуляция или пробел.
Это создает проблему для чтения нескольких слов, это может быть решено с помощью нескольких %s
в строке формата вы должны предоставить отдельный массив для каждого слова в качестве аргумента после строки формата, например
scanf("%s%s%s", string1, string2, string3)
это scanf
Вызов ожидает три слова от пользователя, где каждое слово отделяется пробелом. Убедитесь, что для каждого из массивов выделена память, хотя в противном случае вы будете записывать в память программу, которая обычно не принадлежит, что приводит к ее аварийному завершению. Точно такой же эффект для приведенного выше кода может быть достигнут с помощью scanf
несколько раз с одним %s
в строке формата.
Если вам нужно все, как одна строка, тот же массив, который вы можете использовать strcat
который объединит две строки вместе. Функция проста в использовании, но еще раз убедитесь, что ваши аргументы распределены массивы перед вызовом strcat
в противном случае это может привести к сбою или неожиданному поведению.
Вот ссылки на обе функции:
scanf
- http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
strcat
- http://www.cplusplus.com/reference/clibrary/cstring/strcat/
Надеюсь, это поможет =]
scanf
с форматом %s
будет принимать строку, разделенную пробелами.
Сбой, скорее всего, вызван переполнением (или неспособностью зарезервировать место) входной строки.