Исправление действительно
if (!isalpha((unsigned char)argv[1][i]))
Функция / макрос isalpha
принимает только одно целое число, которое должно иметь значение одного символа как unsigned char
. Но argv[1]
является указателем на несколько символов!
Теперь, как дополнительное усложнение, isalpha
часто реализуется как макрос и часто кодируется так, что компилятор не выдает any диагностика для неправильного типа аргумента. Это прискорбно, но вам просто нужно , чтобы знать это, когда вы программируете на C.
Требуется также приведение от char
к unsigned char
- если нет, то любойрасширенные символы (например, ä
) вызовут неопределенное поведение на платформах, где подписано char
- и они равны на процессорах x86 - потому что значение будет отрицательным, но isalpha
будет ожидать толькочисло, которое является либо EOF
, либо неотрицательным числом, меньшим или равным UCHAR_MAX
.