powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос про strtok
5 сообщений из 5, страница 1 из 1
Вопрос про strtok
    #33822829
kerzh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет всем.

Подскажите пожалуйста, почему данный код в VS2005 вызывает ошибку доступа к памяти

#include <stdio.h>
#include <tchar.h>
#include <iostream>


int main( void )
{
char* str = "a b c";
char *seps = " \n";
char *token1,
*token2,
*next_token1,
*next_token2;


token1 = strtok_s(str, " ", &next_token1);

std::cout << (token1 == NULL);

}

хотя если объявить переменную str как массив (сhar str[] = "a b c") все работает?

Спасибо.
...
Рейтинг: 0 / 0
Вопрос про strtok
    #33822858
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что strtok вбивает нолик прямо в буфер. То есть была на входе строка в памяти "a b c\0" стала "a\0b\0c\0" (\0 это нулевой байт).

Объявляя строку "a b c" ты выделяешь в памяти шесть байт и заполняешь их этой строкой.
Но если ты объявляешь:
Код: plaintext
 char* str = "a b c";
На стеке у тебя создается указатель, а память под строку выделяется в сегменте данных защищеном от записи. Возможно даже в сегменте кода (это как решит компилятор).
Код: plaintext
 char str[] = "a b c";
А здесь память под строку выделяется на стеке, а указателя не создается вообще.
...
Рейтинг: 0 / 0
Вопрос про strtok
    #33822876
kerzh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А нельзя ли как-нибудь разбить строку char *str?
ведь в сигнатуре функции написана именно char *str?

То есть у меня в функцию передается указатель и надо разбить на токены.
Как мне быть?
...
Рейтинг: 0 / 0
Вопрос про strtok
    #33822988
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать функцию strtok(). Она именно этим и занимается - разбивает строку на токены.
...
Рейтинг: 0 / 0
Вопрос про strtok
    #33823113
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kerzhА нельзя ли как-нибудь разбить строку char *str?
ведь в сигнатуре функции написана именно char *str?

Советую прочитать в любой книжке по С++ работу с массивами и указателями. Особенно ту часть, где говорится, что если объявлен массив a[n] (где n-любое положительное число >0), то запись a эквивалентна записи a[0], а+1 эквивалентна записи a[1] и т.д. Кроме того можно делать такие вещи:
Код: plaintext
1.
2.
3.
4.
5.
char str[ 10 ];
char *p;
....
p=str;
.....
То есть имя массива является одновременно указателем...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос про strtok
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]