Я рассматриваю некоторые общие вопросы о c/c++ в перпаратации для экзамена. Один из этих вопросов - описать значение, возвращаемое функцией leer (char * a). Я ожидал, что функция вернет количество пробелов в строке ac, но мои тесты показали, что leer действительно просто проверяет самый первый символ и, следовательно, просто возвращает 1, если первый элемент является пробелом и 0, если нет. Он даже не выполняет итерацию по строке, но возвращает после проверки первого символа, в то время как тот же цикл внутри основной функции подсчитывает все пробелы, как я думал изначально. Я не понимаю, почему они ведут себя по-другому, потому что аргумент для leer такой же, как тот, который я использую в цикле for внутри моей основной функции. Я предполагаю, что мне не хватает знания указателя здесь, но я не могу понять, почему мои первоначальные мысли ошибочны.
#include <iostream>
int leer(char *a)
{
for(int b=0;*a!='\0';a++)
{
if(*a==' ') b++;
return b;
}
}
int main()
{
char *a = "Dies ist ein Test";
std::cout << leer(a) << std::endl; //Prints 0
int b;
for(b=0;*a!='\0';a++)
{
if(*a==' ') b++;
}
std::cout << b << std::endl; //Prints 3
}
Проблема в том, что вы возвращаетесь после первой итерации. Вам нужно поместить оператор return
после цикла:
for(int b=0;*a!='\0';a++)
{
if(*a==' ') b++;
}
return b;
Эти две циклы не совсем одинаковы. Обратите внимание, что в leer
оператор return
находится внутри цикла. Это означает, что он вернется во время первой итерации и никогда не будет иметь шансов продолжить через строку.
Цикл в main
однако, не имеет никакого препятствия, чтобы он продолжал через строку. Значение b
увеличивается, а затем выводится после цикла.
Ваша функция leer
должна быть записана таким же образом, где значение b
возвращается после цикла.
Причина, по которой он не работает, как указано, возвращает return b;
, Его теоретически выполняются на каждой итерации, но практически, конечно, только в первом, потому что после того, как мы его выполнили, мы больше не работаем.
Потому что в вашем основном() у вас нет возврата... как в
return b;
Это выйдет из цикла после первой итерации.
Я предлагаю вам форматировать свой код для упрощения чтения.
int leer(char *a) { for(int b=0;*a!='\0';a++) if(*a==' ') b++; return b; }
Я просто изменил его в своем компиляторе по любой причине. Таким образом, правильный ответ на вопрос не будет ни количеством пробелов, ни тем, если первый символ является пробелом. b определен в области действия цикла for и, следовательно, невидим для возврата, и единственное, что он вернет, это синтаксическая ошибка, верно?