Недавно я взял язык программирования C (2-е изд.) И проработал через примеры из книги. Массивы дают мне проблемы. В частности, это, по-видимому, связано с типом. В примере раздела 1.6 читается ввод, а затем подсчитывается, сколько символов попадает в определенные категории. Этот сегмент кода, по-видимому, создает segfault, когда я передаю исходный код через исполняемый файл, в дополнение к тому, чтобы не улавливать любые числовые символы. Если я использую стандартный ввод и^D для EOF, то он не улавливает числа вообще и вместо этого считает их как другие символы (хотя без segfault).c segfault прямо из учебника
while ((c=getchar())!=EOF)
if(c>='0'&&c>='9')
++ndigit[c-'0'];
я устранил вероятность того, что это другая часть программы, вызывающей ошибку путем замены других разделов, но я не могу опубликовать остальные в любом случае, если это помогает. По моему мнению, этот цикл должен пробиваться через отдельные символы на входе. Если они имеют значение от 0 до 9, оно преобразует символ в число (соответствующее позиции ndigit array 0-9) и увеличивает это положение массива на 1.
Неужели K & R 2e сильно устарел? Является ли кодировка символов (ASCII vs Unicode) проблемой при преобразовании номера символа в целое число? Любой совет будет принят во внимание.
Я не уверен, как проверить мою кодировку (если она даже имеет значение), но мой компилятор GCC (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
вы можете использовать [ 'INT isdigit (интермедиат с);'] (HTTP : //www.cplusplus.com/reference/cctype/isdigit/), чтобы проверить, является ли символ десятичной цифрой. –
Это лучший способ проверить, является ли это номером? В отличие от 'if (c> = '0' && c <= '9')' – nowLearningC
Well 'if (c> = '0' && c> = '9')' неверно, поскольку @ouah ответил. для меня предпочтительной будет макрофункция. '#defined isDigit (c) (c> = '0' && c <= '9')' –