Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция strlen() и переменные типа char 
:(
    Опции темы
mr.Anderson
Дата 2.8.2005, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Я написал код:
Код

#include <iostream.h>
#include <conio.h>
void main(void)
{
exit: clrscr();
int i,h=0;
char q;
char str[100000];
cout<<"Enter your text: "; gets(str);
for(i=0;i<=(strlen(str)-1);i++)
{
 if(str[i]=='S') {str[i]='1';h++;}
}
cout<<"Preobrazovano: "<<h<<"\nNew text: "<<str;
cout<<"\n\nExit? If yes, enter Y, else enter N: ";cin>>q;
if(q!='Y') goto exit;
}

Вопрос 1: почему функция strlen() работает, несмотря на то, что файл <string.h>, в котором она описана, не подключен?
Вопрос 2: почему переменной str нельзя присвоить больше 1 символа (в коде это в цикле for в инструкции if)? Как сделать, чтобы можно было присвоить больше?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
ManiaK
Дата 2.8.2005, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Цитата(sim7 @ 2.8.2005, 17:14)
почему переменной str нельзя присвоить больше 1 символа

Переменная str является символьным массивом. "Больше одного символа" - так же символьный массив. Прямое присвоение массива массиву в Си++ не разрешается. Подробнее по строкам:
http://forum.vingrad.ru/index.php?act=modu...dule=vingradfaq

Цитата(sim7 @ 2.8.2005, 17:14)
почему функция strlen() работает, несмотря на то, что файл <string.h>, в котором она описана, не подключен?

Вероятно этот файл подключается в одном из этих:

Цитата(sim7 @ 2.8.2005, 17:14)
#include <iostream.h>
#include <conio.h>


PM MAIL WWW   Вверх
mr.Anderson
Дата 2.8.2005, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Цитата
"Больше одного символа" - так же символьный массив.

smile Вы меня не поняли. Я имел в виду не присвоение фразы "больше одного символа", а в прямом смысле - присвоить переменной str не 1 символ, а 2, 3 и так далее. Например, почему ошибочной является запись:
Код

str[i]="123456";

Я об этом спрашивал. smile О том, что массив массиву присвоить нельзя, это я знаю.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
ManiaK
Дата 2.8.2005, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



"123456" - является массивом. str[i] - одиночный символ в массиве str.
Как по-вашему, можно записать в один байт шесть байтов? Думаю, неплохо было бы вам сначала литературу по Си++ почитать. Мы не учим языку программирования, мы учим технике программирования и помогаем решать задачи.
PM MAIL WWW   Вверх
mr.Anderson
Дата 2.8.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Цитата
Как по-вашему, можно записать в один байт шесть байтов?

А как же тогда делать?

P.S. Если вы меня будете отсылать в FAQ, то про FAQ я уже писал в теме "Указатели". Оно у меня не работает, поэтому и прошу помощи в форуме.

Цитата
Думаю, неплохо было бы вам сначала литературу по Си++ почитать

А у меня есть учебник. Даже два. Только там объяснено так, как я не понимаю. И примеров нет.

Это сообщение отредактировал(а) sim7 - 2.8.2005, 16:56


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
ManiaK
Дата 2.8.2005, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Цитата(sim7 @ 2.8.2005, 17:54)
Цитата 
Как по-вашему, можно записать в один байт шесть байтов?

А как же тогда делать?

Это не сделать никак.
PM MAIL WWW   Вверх
mr.Anderson
Дата 2.8.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Жаль. Ладно, закрывайте тему.

Это сообщение отредактировал(а) sim7 - 2.8.2005, 17:09


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
kometa_triatlon
Дата 2.8.2005, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 384
Регистрация: 7.1.2005
Где: Киев

Репутация: 2
Всего: 6



Цитата
Вопрос 2: почему переменной str нельзя присвоить больше 1 символа (в коде это в цикле for в инструкции if)? Как сделать, чтобы можно было присвоить больше?

Используй функции для работы со строками - например srtcpy
Читать Дейтела!


--------------------
Всё очень просто: сказки обман,
Солнечный остров скрылся в туман,
Замков воздушных не носит земля,
Кто-то ошибся, ты или я.

--------------
Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым.
PM MAIL ICQ   Вверх
codelord
Дата 2.8.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 1
Всего: 39



Цитата(sim7 @ 2.8.2005, 16:35)
Например, почему ошибочной является запись:

код C++
1:
str[i]="123456";


так устроит:

Код

sprintf(str,"%s","123456");





--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Earnest
Дата 2.8.2005, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



codelord
ну что за дикий пример? Ведь человек правда будет думать, что строку в строку только через prinf засунуть можно...

sim7
В данном случае сойдет strcpy(str,"123456"). Соответственно, если тебе нужно засунуть 123456 в конкретное место строки, пиши strcpy(&str[pos],"123456").
Только позаботься о том, чтобы места в строке было достаточно

А вот этот твой код:
Код

for(i=0;i<=(strlen(str)-1);i++)
{
 if(str[i]=='S') {str[i]='1';h++;}
}

просто ужасен!
На каждой итерации программа вычисляем размер строки, и делаеn она это, просматривая все символы строки, пока не доберется до 0-го символа. Каждый раз!
Лучше так:
Код

for (char* p = str; *p != 0; ++p)
{
   if (*p == 's') { *p = '1'; h++; }
}




--------------------
...
PM   Вверх
mr.Anderson
Дата 2.8.2005, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Ой... smile Интересный код. Одни указатели... Мож, прокомментируете его? А то я чего-то не совсем въехал...


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Void
Дата 2.8.2005, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



sim7
Ну, поехали построчно...
Код
for (char* p = str; *p != 0; ++p)

p - это своеобразный счетчик цикла, он будет бежать вдоль строки, поочередно указывая на ее элементы (символы, char). *p != 0 означает, что цикл будет выполняться, пока элемент, на который указывает p, не будет равным 0 (ты, наверное уже знаешь, что строки в Си оканчиваются нулевым символом). ++p - инкремент, на каждом шаге цикла к p будет прибавляться 1, и он будет указывать на следующий символ в строке.
Код
if (*p == 's') { *p = '1'; h++; }

Ну теперь, удумаю, понятно. Если текущий символ (на который указывает p) - это 's', то заменяем его (символ) на '1' и прибавляем к h единицу.
p - это адрес в памяти.
*p - это то, что находится по этому адресу.

Если нужно, постараюсь еще подробнее.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.Anderson
Дата 2.8.2005, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Здорово! Вот так бы все объясняли. Все стало предельно ясно. Спасибо огромное, void. А также спасибо Earnest за код. От меня обоим + в репутацию. smile
P.S. Void, если что, я надеюсь, вы мне поможете еще раз. smile


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2189 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.