1

Недавно я взял язык программирования 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

+0

вы можете использовать [ 'INT isdigit (интермедиат с);'] (HTTP : //www.cplusplus.com/reference/cctype/isdigit/), чтобы проверить, является ли символ десятичной цифрой. –

+0

Это лучший способ проверить, является ли это номером? В отличие от 'if (c> = '0' && c <= '9')' – nowLearningC

+0

Well 'if (c> = '0' && c> = '9')' неверно, поскольку @ouah ответил. для меня предпочтительной будет макрофункция. '#defined isDigit (c) (c> = '0' && c <= '9')' –

ответ

5
if(c>='0'&&c>='9') 

Ну вы имели в виду:

if(c>='0'&&c<='9') 

Также, пожалуйста, убедитесь, что c правильно объявлена ​​с типом int и не char.

+0

Для OP: узнайте [Почему C должен быть int no char] (http://faq.cprogramming.com/cgi- bin/smartfaq.cgi? id = 1043284351 & answer = 1048865140) –

+0

Вау, атака опечатки. Мне даже пришлось некоторое время смотреть на ваш ответ, прежде чем я увидел это. Да, в коде нет переменных char, но это> = необходимая коррекция. Исправлена! – nowLearningC

+0

@ user2546556 [вы можете принять этот ответ] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work?answertab=votes#tab-top) Просто спрашивайте, потому что вы новый пользователь. –

0

Я застрял в этом упражнении из-за опечатки в моем цикле массива.

for (i = 0; 1 < 10; ++i) 
    ndigit[i] = 0; 

Это должно было быть ..

for (i = 0; i < 10; ++i) 
     ndigit[i] = 0; 

Примечание я и переставляются