Вы путаете несколько вещей.
strtok принимает аргументы (char *, const char *) .... name это массив и, следовательно, указатель на его первый элемент ...
name
- это массив, а - это не указатель на его первый элемент. Массив распадается в указателе на свой первый аргумент в нескольких контекстах, но в принципе это совершенно другая вещь. Вы замечаете это, например когда вы применяете оператор sizeof
к указателю и к массиву: для массива вы получаете размер массива (т.е. совокупный размер его элементов), для указателя вы получаете размер указателя (который является фиксированным).
но если мы сделали объявление вроде string name = "avinash" и передали name в качестве аргумента
тогда прога не работает, но должна, потому что имя строки является указателем на ее первый символ ...
Если вы сделаете декларацию типа
string name="avinash";
вы говорите совершенно другое; string
здесь не C-строка (то есть char[]
), а тип C ++ std::string
, который является классом, который управляет динамической строкой; эти две вещи совершенно разные.
Если вы хотите получить постоянную C-строку (const char *
) из std::string
, вам нужно использовать метод c_str()
. Тем не менее, вы не можете использовать указатель, полученный таким образом с strtok
, так как c_str()
возвращает указатель на C-строку const
, то есть она не может быть изменена. Обратите внимание, что strtok
не предназначен для работы со строками C ++, поскольку он является частью устаревшей библиотеки C.
также, если мы напишем const string n = "n"; и передать его в качестве второго аргумента, он не работает ... это была моя первая проблема ...
Это не работает для точно такой же мотивации, но в этом случае вы можете просто использовать метод c_str()
, поскольку второй аргумент strtok
- это const
char *
.
теперь также размер вывода (name) равен 8, но это должно быть 4, поскольку avinash был токенизирован.
sizeof
возвращает «статический» размер своего операнда (т. Е. Сколько памяти выделено для него), он ничего не знает о содержимом name
. Чтобы получить длину C-строки, вы должны использовать функцию strlen
; для C ++ std::string
просто используйте метод size()
.