C strcpy и strcat

У меня есть вопрос о strcpy и strcat.

В программе, которую я пытаюсь сделать, мне нужно получить год рождения кого-то из фискального кода. Фискальный код задается в виде символа из последовательного порта,

strcpy(temp, code[6]);
strcat(temp, code[7]);
yyyy = 1900 + (atoi(temp));

Вот что я придумал: в основном две последние цифры года будут добавлены к 1900 (я знаю, что это не совсем работает с людьми, родившимися в 2000 году). Первая цифра копируется из полного кода во временную переменную с помощью strcpy, затем я хотел бы добавить вторую цифру, чтобы затем использовать atoi и преобразовать все в целое число; для этого я использую strcat так, как никогда раньше не видел. Я делаю это правильно?


person riccardocasali    schedule 22.10.2015    source источник
comment
Как объявляется code?   -  person ameyCU    schedule 22.10.2015
comment
Что такое code? Что такое temp? Это не второстепенный вопрос, это разница между нормально работающим и неопределенным поведением.   -  person DevSolar    schedule 22.10.2015
comment
Вам нужно показать больший объем кода, чтобы получить помощь, связанную с результатами некоторых тестов.   -  person Kotshi    schedule 22.10.2015
comment
На тот случай, если code является строкой C (char[]), обратите внимание, что и strcpy, и strcat требуют char * операндов, а вы передаете char... т. е. неопределенное поведение.   -  person DevSolar    schedule 22.10.2015


Ответы (1)


Нет необходимости в strcpy/strcat (и в любом случае они не подходят в этом контексте). Также нет необходимости во временной строке. Вы можете просто сделать это:

yyyy = 1900 + (code[6] - '0') * 10 + (code[7] - '0');

Это просто извлекает двухзначные символы, преобразует каждый из них в целое число в диапазоне 0..9, а затем вычисляет год из этих двух значений.

person Paul R    schedule 22.10.2015
comment
Справедливое предупреждение: хотя это распространено, в C нет гарантии, что "0123456789" является строкой последовательных char значений. -редактировать- Теперь я вижу. Не знал об этом :) - person ; 22.10.2015
comment
^^ лол. В любом случае, на самом деле писать код нельзя — это слишком сложно. Вы можете использовать библиотечные функции только для обработки строк в C :) - person Martin James; 22.10.2015
comment
@Rhymoid: как в C, так и в C++ соответствующие стандарты предписывают, чтобы символы от 0 до 9 были смежными и упорядоченными, поэтому этот метод работает для ASCII и EBCDIC и всего остального в этом отношении. - person Paul R; 22.10.2015
comment
Извините, я набрал «строки»? Я имел в виду «невероятно хромые массивы символов с нулевым завершением» :) - person Martin James; 22.10.2015
comment
@Rhymoid: на самом деле стандарт (как C, так и C++) действительно гарантирует последовательные цифры. (Для C это параграф 3 раздела 5.2.1, значение каждого символа после 0 в приведенном выше списке десятичных цифр должно быть на единицу больше, чем значение предыдущего. Это буквы, которые не обязательно Но я признаю, что тоже вздрагиваю всякий раз, когда вижу подобную арифметику символов, и я не уверен на 100%, что происходит в случае кросс-компиляции, если исходный набор символов != набор символов выполнения. ;-) - person DevSolar; 22.10.2015
comment
@DevSolar Спасибо за ссылку на пункт! - person ; 22.10.2015
comment
@MartinJames Это плохо, я должен отметить юмор низкого качества ;) - person Kotshi; 22.10.2015