ASCII? Никакая современная ОС больше не использует ASCII. Они все используют коды на 8 битов, по крайней мере, подразумевая, что это - или UTF-8, ISOLatinX, WinLatinX, Макрочеловек, Shift JIS или независимо от того, что там.
единственный тест, о котором я знаю, должен проверить на недопустимые символы UTF-8. Если Вы находите кого-либо, то Вы знаете, что это не может быть UTF-8. То же, вероятно, возможно для UTF-16. Но когда это не набор Unicode, тогда будет трудно сказать, какой кодовой страницей Windows это могло бы быть.
Большинство редакторов я знаю соглашение с этим, позволяя пользователю выбрать значение по умолчанию из списка всей возможной кодировки.
существует код там для проверки законности символов UTF.
Я не могу согласиться со многими советами, которые вы получили. Вам не следует не сосредотачиваться на ручном управлении памятью. Ручное управление памятью было / трудно избежать в C. Однако для большей части кода C ++ нет необходимости в использовании ручного управления памятью. Ручное управление памятью часто используется в большом объеме кода, что приводит к множеству проблем, которых можно было бы легко избежать.
Первое и самое важное, что нужно изучить, - это стандартная библиотека. Он существенно отличается от .NET (мягко говоря). Я бы сразу посоветовал взять копию Accelerated C ++ и поработать над ней. Он предназначен для людей, занимающих именно ваше положение (т.е. изучающих C ++, но уже имеющих опыт работы хотя бы с одним другим языком), и для этой ситуации я Я почти уверен, что лучшей книги нет.
Изменить: (в основном в ответ на комментарий Кенни) - это правда, что, особенно если вы поддерживаете существующий код, есть довольно хороший шанс, что вы застрянете в изучении любой нормальный человек, вероятно, предпочел бы избежать всевозможных неприятностей. Точно так же, в зависимости от того, к какой команде вы присоединитесь, вы можете застрять в уродстве даже в новом коде. К сожалению, без достаточного количества знаний и опыта работы с языком может быть не совсем понятно, что искать.
я застряну в изучении всяческих неприятностей, которых, вероятно, предпочел бы избежать любой здравомыслящий человек. Точно так же, в зависимости от того, к какой команде вы присоединитесь, вы можете застрять в уродстве даже в новом коде. К сожалению, без достаточного количества знаний и опыта работы с языком может быть не совсем понятно, что искать. я застряну в изучении всяческих неприятностей, которых, вероятно, предпочел бы избежать любой здравомыслящий человек. Точно так же, в зависимости от того, к какой команде вы присоединитесь, вы можете застрять в уродстве даже в новом коде. К сожалению, без достаточного количества знаний и опыта работы с языком может быть не совсем понятно, что искать.Если вы планируете работать над платформой Windows, вам стоит взять копию Advanced Windows Debugging , которая содержит отличное введение в различные инструменты отладки которые доступны разработчикам Windows.
На мой взгляд, есть несколько вещей, которые вам нужно изучить / обновить:
Я думаю, что это самые важные из них.
Бейте себя по голове, пока не умрете ваша способность чувствовать боль.
As stated by others, pointers and memory management should be your priorities. You definitely need to understand pointers. That is the most difficult concept in C/C++ programming. It seems a lot of people just can't get their minds around pointers and until you do, you will never be a C or C++ programmer.
Yes, there are great libraries that handle memory management for you but, because there is a lot of code that has been developed without those libraries, you are probably going to be dealing with some mallocs/frees or new/delete's. Unless of course, you have the luxury of walking into a job where you are only writing new code and you can "do things right" from the start. If you find that company, let me know. I'd like to submit my resume too!
Во-первых, это управление памятью, включая указатель ...
И научиться кодировать что-нибудь кросс-платформенное (это то, что мне нравится;))
Синтаксис всегда можно подобрать в любое время даже после получения позиции. Важно учитывать, как решить проблему. Какой алгоритм лучше подойдет для конкретной задачи. Сколько вы помните объектно-ориентированного программирования. Насколько хорошо вы справляетесь с указателями и арифметикой указателей.
Я думаю, что забыть о синтаксисе - это нормально, самое важное - как решать проблемы.
Это зависит от того, в ЧЕМ у вас есть опыт. Вряд ли у кого-то есть опыт во всем и вокруг C #. Одно может быть управление памятью. С другой стороны, если у вас есть большой опыт работы с небезопасным кодом C #, вы уже знаете почти все, что есть. Другое дело, например, платформа / com. То же самое, если вы уже много работали над программированием взаимодействия. Чтобы быть эффективным, вам, вероятно, потребуется немного практики. Также стиль программирования часто сильно отличается.
Если вы уже знаете C #, вы, вероятно, хочу освежить в памяти управление памятью, указатели / ссылки и (для C ++) STL.
Я думаю, это зависит от того, какую должность C / C ++ вы имеете в виду. Для встроенной работы вам лучше хорошо разбираться в указателях и понимать ключевое слово volatile. Для вещей более высокого уровня (особенно в C ++) вы, вероятно, захотите изучить некоторые из популярных библиотек (STL, boost и т. Д.). Для большей части программирования на C будет важно быть комфортным с POSIX.
Я думаю, номер один с точкой - управление памятью. Это означает malloc / free, new / delete, все прочие странные вещи C ++ (конструкторы копирования) и указатели в целом.
С практической точки зрения я бы сказал, что приоритет номер один - вы снова тренируетесь в ручном управлении временем жизни объектов. Большая экономия времени в C # и мире .Net - это волшебство, которое предоставляет сборщик мусора. В управляемом мире все еще необходимо управлять памятью, но это гораздо более простая задача, и она не обязательно связана с поддержанием ментальной модели владения объектами и времени их жизни.
В C / C ++ вы снова входите в мир проблемного управления памятью, управления временем жизни и владения объектами.
Арифметика указателя, вероятно, будет первой в списке. Кроме того, может помочь хорошее понимание управления памятью в неуправляемом мире - например, напоминание удалить то, что вы создаете с помощью new .
Самый важный совет, который я могу придумать: не пытайтесь применять методы кода C # с C ++. Избегайте создания объектов с новыми, используйте бесплатные функции, забудьте об отражении ... просто относитесь к нему как к совершенно другому языку и попытайтесь изучить его с нуля.
Первое, что нужно изучить: C и C ++ - два разных языка. Даже в тех случаях, когда код действителен на обоих, очень часто это плохой код на обоих (иногда ни на одном из них).
Выберите один из языков и изучите его. Затем научитесь другому, если хотите. C ++ более сложен, но вы уже будете знакомы со многими из них. C менее сложен, но работает иначе, чем C #. С помощью C вы программируете на более низком уровне, ближе к машине, что может быть желательно или нежелательно.
Вы можете посмотреть это видео от службы технической поддержки Google, в котором объясняются передовые методы кодирования JavaScript, которое является основной частью разработки расширений Firefox
Я бы занялся управлением памятью с другой точки зрения: прочитайте книгу по архитектуре компьютера, чтобы понять, что такое память на самом деле, а затем освежите свой ассемблер. Это даст вам представление о том, что происходит под капотом (который очень тонкий в C). C ++ помогает немного продвинуться вперед, но ассемблер все еще скрывается под капотом.
Фактически C ++ - это C с классами и шаблонами. Это небольшое упрощение и технически неверно, но дает вам 80% пути.
Тогда ... купите:
Язык программирования C Кернигана и Ричи. Это книга C.
Язык программирования C ++, автор Strousoup; это стандартный справочник по C ++.
В зависимости от того, насколько глубоко и хардкорно вы разбираетесь, вы можете захотеть получить книги по Эффективному C ++ и Ускоренный C ++.