Форум программистов, компьютерный форум CyberForum.ru

Строки char и магия - C++

Восстановить пароль Регистрация
 
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
08.07.2013, 16:52     Строки char и магия #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <cstdlib>
#include <iostream>
#include <string.h>
 
using namespace std;
 
int main(void)
{
    cout << "Vvedite znachenie treh strok:\n";
    char str1[20],str2[20],str3[20],s[1];
    cin >> str1; 
    cin >> str2; 
    cin >> str3;
    int ans;
    while (ans!=3)
    {
    cin >> ans;
    switch(ans){
                case 1:
                                s[0]=str1[0]; s[1]=0; strupr(s); str1[0]=s[0]; s[0]=0;
                                //s[0]=str2[0]; strupr(s); str2[0]=s[0]; s[0]=0;
                                //s[0]=str3[0]; strupr(s); str3[0]=s[0]; s[0]=0;
                                break;
            
                case 2:
                                cout << "Stroki: \n" << str1 << "\n" << str2 << "\n" << str3 << "\n";
                                break;                 
                }
    }
    cin.get();
    return 0;
}
Запускаем, вывод:
"Вложение 1"

3-я строка куда-то пропадает.

Делаем вот так:
C++
1
2
3
...
    char s[1],str1[20],str2[20],str3[20];
...
Запускаем, вывод:
"Вложение 2"

Т.е. всё как надо.

И собственно вопрос: что это за эффект такой? В Паскале такой магии небыло...
Изображения
  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2013, 16:52     Строки char и магия
Посмотрите здесь:

строки типа char C++
C++ Строки с типом char * в С++
Запись строки char в массив char C++
C++ Сравнивание char строки с текстом
C++ перевод строки CHAR
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Мимино
 Аватар для Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
08.07.2013, 17:04     Строки char и магия #2
У меня нормально выводит (MSVS2010)

Добавлено через 5 минут

Не по теме:

Не могу не спросить... Как Вам пришло в голову решить проблему так?:

C++
1
    char s[1],str1[20],str2[20],str3[20];
Интересно узнать ход мыслей

CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
08.07.2013, 17:11     Строки char и магия #3
C
1
s[1]=0;
Так нельзя. В массиве s ровно 1 элемент, обращение происходит ко второму.
Память в данном случае выделяется статически, очевидно, на вашем компиляторе , выполняется с права налево и память выделяется в неразрывной области, т. е. &(s[1]) тождественно равно &(str3[0]) которую вы и зануляете попадая в другой массив. Программа не вылетает по тому, что выходя за границы массива s не происходит обращения за границы памяти выделенной для данной программы.
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
08.07.2013, 17:15  [ТС]     Строки char и магия #4
Долго шаманил и с s[1]=0 и s[0]=0 и без, и с закомментированными строками, в большой программе. Решил вырвать кусок и сделать маленькую программку (то что скидывал), думал мб что-то другое влияет и я не уследил...
Заметил что 3-я строка пропадает даже если
C++ (Qt)
1
2
case 1:
                                s[0]=str1[0]; s[1]=0; break;
и больше ничего.
Поэтому обратил внимание на
C++ (Qt)
1
char s[1],str1[20],str2[20],str3[20];
Кстати пишу в wxDec-C++, может это баг у них в среде?...
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
08.07.2013, 17:16     Строки char и магия #5
C
1
2
3
4
5
                case 1:
                                s[0]=str1[0]; s[1]=0; strupr(s); str1[0]=s[0]; s[0]=0;
                                //s[0]=str2[0]; strupr(s); str2[0]=s[0]; s[0]=0;
                                //s[0]=str3[0]; strupr(s); str3[0]=s[0]; s[0]=0;
                                break;
по моему это можно записывать более кратко, и не менее выверенно:
C
1
s[0] += s[0] >= 'a' && s[0] <= 'z' ? 'A' - 'a' : 0;
или, если доподлинно известно что там всегда будет строчный символ, можно написать
C
1
s[0] += 'A' - 'a';
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
08.07.2013, 17:18  [ТС]     Строки char и магия #6
Цитата Сообщение от CEBEP Посмотреть сообщение
Так нельзя. В массиве s ровно 1 элемент, обращение происходит ко второму.
Я понимаю, но если не занулять s[1] то пулучаю вот это: "Вложение".

т.е. компилятор сам не понимает где у него str3 а где s, ведь я пишу strupr(s), почему он вылетает за пределы?
Изображения
 
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
08.07.2013, 17:20     Строки char и магия #7
FinalQ, s[1] не существует! Вы входите за пределы массива.
CEBEP
105 / 105 / 9
Регистрация: 21.03.2010
Сообщений: 437
08.07.2013, 17:20     Строки char и магия #8
Цитата Сообщение от FinalQ Посмотреть сообщение
не занулять s[1]
если не отходить от данного способа, то занулять, конечно надо, но тогда память под нулевой байт придётся выделить. т. е.
C
1
char str1[20],str2[20],str3[20],s[2];
и всё в порядке.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
08.07.2013, 17:21     Строки char и магия #9
C++
1
char str1[20],str2[20],str3[20], s[2];
C++
1
s[0] = str1[0]; s[1] = '\0'; strupr(s); str1[0] = s[0];
но лучше
C++
1
str1[0] = toupper(str1[0]);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2013, 17:34     Строки char и магия
Еще ссылки по теме:

Запись элемента строки в char C++
Обработка строки Char C++
Преобразование char в char* или разделить на две строки C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
08.07.2013, 17:34  [ТС]     Строки char и магия #10
Спасибо. Более мение разобрался... Т.е. в строке str[5] можно ввести 4 символа (0 1 2 3) и обязательно должен быть \0 (4) в конце? Непонятно осталось другое, в некоторых случаях строка зануляется автоматически, а в некоторых вылетает за пределы и приходится занулять самому...
Yandex
Объявления
08.07.2013, 17:34     Строки char и магия
Ответ Создать тему
Опции темы

Текущее время: 05:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru