Передача char * в качестве аргумента функции ведет себя неожиданно

0

Я рассматриваю некоторые общие вопросы о 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

}
  • 0
    Это не имеет ничего общего с указателями. Посмотрите на обратное утверждение.
  • 0
    Да, ну, это смущает: я был так сосредоточен на указателе, что я даже не заметил этого. Спасибо за указание, я бы искал часами.
Теги:
function
arguments
char

4 ответа

2

Проблема в том, что вы возвращаетесь после первой итерации. Вам нужно поместить оператор return после цикла:

for(int b=0;*a!='\0';a++)
{
    if(*a==' ') b++;
}
return b;
  • 0
    Спасибо за ответ, я был так сосредоточен на указателе, что даже не заметил этого.
1

Эти две циклы не совсем одинаковы. Обратите внимание, что в leer оператор return находится внутри цикла. Это означает, что он вернется во время первой итерации и никогда не будет иметь шансов продолжить через строку.

Цикл в main однако, не имеет никакого препятствия, чтобы он продолжал через строку. Значение b увеличивается, а затем выводится после цикла.

Ваша функция leer должна быть записана таким же образом, где значение b возвращается после цикла.

  • 0
    Вроде очевидно, но я был так сосредоточен на указке штучки: D. В любом случае, спасибо за ответ.
0

Причина, по которой он не работает, как указано, возвращает return b; , Его теоретически выполняются на каждой итерации, но практически, конечно, только в первом, потому что после того, как мы его выполнили, мы больше не работаем.

  • 0
    Спасибо за ответ, я бы часами искал: D. Тотали не понял.
0

Потому что в вашем основном() у вас нет возврата... как в

return b;

Это выйдет из цикла после первой итерации.

Я предлагаю вам форматировать свой код для упрощения чтения.

  • 0
    Да, очевидно, когда кто-то снова направит вас на правильный путь. Первоначальный формат в задаче еще хуже, это: int leer(char *a) { for(int b=0;*a!='\0';a++) if(*a==' ') b++; return b; } Я просто изменил его в своем компиляторе по любой причине. Таким образом, правильный ответ на вопрос не будет ни количеством пробелов, ни тем, если первый символ является пробелом. b определен в области действия цикла for и, следовательно, невидим для возврата, и единственное, что он вернет, это синтаксическая ошибка, верно?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню