Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
#1

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

08.07.2013, 16:52. Просмотров 464. Ответов 9
Метки нет (Все метки)

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"

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

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

Различное поведение функции которая копирует строки с char* t и char t[] - C++
столкнулся с ситуацией которую не могу объяснить пишем функцию которая копирует одну строку в другую: void strstr(char* t,...

Преобразование char в char* или разделить на две строки - C++
Пытаюсь сделать программу под linux. Возникла проблема, описанная в заголовке. Мне нужно разделить строку в char на две по символу ? либо...

Строка: чем отличается строки string, char, char*? - C++
Помогите разобраться,совсем плохо идёт,чем отличается строки string,char,char* И если можно пару примеров Буду весьма признательна

Запись строки char в массив char - C++
Глупый вопрос, но что поделать, многое забыл... Хочу записть строку типа char в массив строк типа char, но выдает ошибку что &quot;невозможно...

перевод строки CHAR - C++
Добрый день уважаемые форумчане) Пишу в IARе под AVR столкнулся с проблеммой вычесть из строки лишние символы. к примеру приведу такой код...

Преобразование строки в char - C++
Здравствуйте, не знаю, как можно преобразовать char в string. Но преобразование необычное. Нужно узнать дату последнего редактирования...

9
Мимино
180 / 151 / 5
Регистрация: 22.05.2013
Сообщений: 435
Записей в блоге: 1
08.07.2013, 17:04 #2
У меня нормально выводит (MSVS2010)

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

Не по теме:

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

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

0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
08.07.2013, 17:11 #3
C
1
s[1]=0;
Так нельзя. В массиве s ровно 1 элемент, обращение происходит ко второму.
Память в данном случае выделяется статически, очевидно, на вашем компиляторе , выполняется с права налево и память выделяется в неразрывной области, т. е. &(s[1]) тождественно равно &(str3[0]) которую вы и зануляете попадая в другой массив. Программа не вылетает по тому, что выходя за границы массива s не происходит обращения за границы памяти выделенной для данной программы.
0
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
08.07.2013, 17:15  [ТС] #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++, может это баг у них в среде?...
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
08.07.2013, 17:16 #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';
0
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
08.07.2013, 17:18  [ТС] #6
Цитата Сообщение от CEBEP Посмотреть сообщение
Так нельзя. В массиве s ровно 1 элемент, обращение происходит ко второму.
Я понимаю, но если не занулять s[1] то пулучаю вот это: "Вложение".

т.е. компилятор сам не понимает где у него str3 а где s, ведь я пишу strupr(s), почему он вылетает за пределы?
0
Изображения
 
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
08.07.2013, 17:20 #7
FinalQ, s[1] не существует! Вы входите за пределы массива.
0
CEBEP
107 / 107 / 9
Регистрация: 21.03.2010
Сообщений: 444
08.07.2013, 17:20 #8
Цитата Сообщение от FinalQ Посмотреть сообщение
не занулять s[1]
если не отходить от данного способа, то занулять, конечно надо, но тогда память под нулевой байт придётся выделить. т. е.
C
1
char str1[20],str2[20],str3[20],s[2];
и всё в порядке.
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
08.07.2013, 17:21 #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]);
1
FinalQ
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 17
08.07.2013, 17:34  [ТС] #10
Спасибо. Более мение разобрался... Т.е. в строке str[5] можно ввести 4 символа (0 1 2 3) и обязательно должен быть \0 (4) в конце? Непонятно осталось другое, в некоторых случаях строка зануляется автоматически, а в некоторых вылетает за пределы и приходится занулять самому...
0
08.07.2013, 17:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2013, 17:34
Привет! Вот еще темы с ответами:

Строки с типом char * в С++ - C++
Помогите написать программу по строкам c++ При написании программ использовать нуль–терминированные строки и работать только с типом...

Обработка строки Char - C++
Задание: Пользователь вводит текст(рандомные символы). Найти наибольшую группу символов состоящих не из букв и вывести начальную...

Запись элемента строки в char - C++
Никак не получается записать элемент строки в переменную char. #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cstdlib&gt; ...

удаляем пробелы из строки char!!! - C++
для моего консольного калькулятора хочу добавить функцию удаляющую пробелы!!! так вот нужен цикл который сместит символы когда найдет...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru