Я новичок в C и у меня есть этот код:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{
string s = get_string("Enter string: ");
int measure = 0;
for(int i = 0; i < strlen(s);i++)
{
if(isalpha(s[i])==0)
{
measure++;
}
}
printf("Measure is now %i\n", measure);
}
Если я помещу свой printf внутрь цикла, я увижу правильное инкрементирование меры, но он вернется к нулю, когда у меня будет мой printf после завершения цикла. Я считаю, что это проблема области действия, но я понимаю, что переменная, в данном случае мера, объявленная вне цикла, имеет область действия основной функции и поэтому может быть изменена в циклах for и while. Я думаю, что это неправильно, и я не уверен, как получить значение в рамках цикла, переданного обратно в основную функцию.
Редактировать: я оставляю этот пост таким, каким он был изначально, поэтому комментарии ниже имеют смысл. @MaroBonelli заставил меня заметить, что я запутался между двумя окнами, а printf внутри цикла в этом коде фактически не печатал значения.
if (isalpha(s[i]) == 0)
неверна, она должна быть прямо противоположной:if (isalpha(s[i]))
. - person Marco Bonelli   schedule 21.07.2019measure
будет увеличено. Я подозреваю, что в вашем реальном кодеmeasure
затенено, будучи объявленным в двух разных областях. Добавьте-Wshadow
в строку компиляции (gcc/clang) из/W3
(VS/cl.exe
) и посмотрите, выдаются ли какие-либо предупреждения. - person David C. Rankin   schedule 21.07.2019isalpha(s[i])==0
- пронесся прямо мимо этого. - person David C. Rankin   schedule 21.07.2019man isalpha
): ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: возвращаемые значения не равны нулю, если символ c попадает в тестируемый класс, и ноль, если нет.. Он только говорит, что возвращаемое значение будет отличным от нуля, поэтому вы не можете заранее предполагать какое-либо конкретное значение. Он может быть даже отрицательным. - person Marco Bonelli   schedule 21.07.2019