2015-03-08 3 views
0

первое сообщение и мне нужна помощь по следующему вопросу.Нужна консультация с указателями C++ и массивами символов (C-строки)

«У нас есть функция с тремя параметрами: указатель на массив символов (также известный как C-String) и два указателя на определенные символы (мы будем предполагать, что они указывают на символы в C-String) .

void stringPointerOperation(char* str, char* firstPtr, char* secondPtr){ 
    cout << str << endl; 
    cout << "First character=" << *firstPtr << endl; 
    cout << "Second character =" << *secondPtr << endl; 
} 

А. Как мы выводим из персонажей из firstPtr до конца ул?

B. Как мы узнаем, сколько символов между firstPtr и secondPtr? "

Теперь я думаю, что мне нужно использовать цикл for на arra y и распечатать каждое значение, хотя я не уверен, как это сделать с помощью C-строки. Любая помощь будет оценена по достоинству.

+0

Вы правы в использовании любого типа цикла. Какая у вас самая лучшая попытка? –

+2

cout << firstptr << endl; cout << upperPtr - lowerPtr << endl; – jschultz410

ответ

2

Если я читаю ваш вопрос правильно, если у вас есть строка "Hello world!", а затем, если firstPtr указывает в "Hello" второй 'l' и secondPtr указывает на 'w' в "world!", то это выглядит примерно так:

 
+---+---+---+---+---+---+---+---+---+---+---+---+----+ 
| H | e | l | l | o | | w | o | r | l | d | ! | \0 | 
+---+---+---+---+---+---+---+---+---+---+---+---+----+ 
^   ^  ^
|   |   | 
str   firstPtr secondPtr 

Итак, чтобы напечатать «остаток» строки, например firstPtr приведенный выше рисунок должен сделать очевидным, что вы печатаете его так же, как и любую другую строку.

Изображение должно также четко разъяснить, как получить количество символов между firstPtr и secondPtr, просто вычтите их: secondPtr - firstPtr.

0

Я не понимаю, в чем смысл объявить первый параметр, если на самом деле он не используется в функции. Тем не менее, эта функция может выглядеть

void stringPointerOperation(const char *str, 
          const char *firstPtr, 
          const char *secondPtr) 
{ 
    std::cout << firstPtr << std::endl; 

    if (secondPtr < firstPtr) 
    { 
     const char *p = firstPtr; 
     firstPtr = secondPtr; 
     secondPtr = p; 
    } 

    std::ptrdiff_t n = secondPtr - firstPtr; 

    std::cout << "There are " << n 
       << " characters between pointers " 
       << (const void *)firstPtr 
       << " and " 
       << (const void *)secondPtr 
       << std::endl; 
} 

Вот демонстративной программа

#include <iostream> 
#include <cstddef> 

void stringPointerOperation(const char *str, 
          const char *firstPtr, 
          const char *secondPtr) 
{ 
    std::cout << firstPtr << std::endl; 

    if (secondPtr < firstPtr) 
    { 
     const char *p = firstPtr; 
     firstPtr = secondPtr; 
     secondPtr = p; 
    } 

    std::ptrdiff_t n = secondPtr - firstPtr; 

    std::cout << "There are " << n 
       << " characters between pointers " 
       << (const void *)firstPtr 
       << " and " 
       << (const void *)secondPtr 
       << std::endl; 
} 

int main() 
{ 
    const char *s = "My name is Lewis Russell"; 

    stringPointerOperation(s, s + 11, s + 16); 

    return 0; 
} 

Его выход

Lewis Russell 
There are 5 characters between pointers 0x8048b7a and 0x8048b7f 

Тип станд :: ptrdiff_t просто ЬурейиЙ для некоторого знакового типа Int. Обычно это int. Поэтому, если вы хотите, вы можете заменить std::ptrdiff_t на int.

Если эти заявления

std::cout << str << std::endl; 
std::cout << "First character=" << *firstPtr << std::endl; 
std::cout << "Second character =" << *secondPtr << std::endl; 

также должны присутствовать в функции, то вы можете включить их в код, который я показал.

void stringPointerOperation(const char *str, 
          const char *firstPtr, 
          const char *secondPtr) 
{ 
    std::cout << str << std::endl; 
    std::cout << "First character=" << *firstPtr << std::endl; 
    std::cout << "Second character =" << *secondPtr << std::endl; 

    std::cout << firstPtr << std::endl; 

    if (secondPtr < firstPtr) 
    { 
     const char *p = firstPtr; 
     firstPtr = secondPtr; 
     secondPtr = p; 
    } 

    std::ptrdiff_t n = secondPtr - firstPtr; 

    std::cout << "There are " << n 
       << " characters between pointers " 
       << (const void *)firstPtr 
       << " and " 
       << (const void *)secondPtr 
       << std::endl; 
} 
+0

«Я не понимаю, в чем смысл объявлять первый параметр, если на самом деле он не используется в функции». -- Посмотри снова. –

+0

@ Jim Balter Я не понял, что вы хотели сказать. –

+0

В заявлении о проблеме, как указано в OP, содержится 'cout << str << endl;' ..., который использует первый параметр. Это также сильный намек для студентов относительно того, как решить пункт A. –

Смежные вопросы