Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

Сложение строк вызывает необработанное исключение

16.07.2014, 18:44. Просмотров 1382. Ответов 22
Метки нет (Все метки)

никак не выходит сложить 2 строки... все время выбивает ошибку "Необработанное исключение..." пробовал и через strcat и strcpy ниче не выходит...

C
1
2
3
4
5
6
char* str1 = "test1_";
char* str2 = "test2";
char* str3;
str3 = strcat(str1,str2);
//str3 = strcpy(str1,str2);
printf("%s\n",str3);
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2014, 18:44
Ответы с готовыми решениями:

Необработанное исключение
В общем дали задание с циклами. Суть такова: вводятся значения x>1 e>10. Значение a считается по...

Необработанное исключение по адресу
Необработанное исключение по адресу 0x0F315976 (msvcr110d.dll) в ConsoleApplication2.exe:...

Необработанное исключение, нарушение права доступа записи
Добрый день! Пытаюсь сделать, вот эту лабораторную работу: Даны вещественные числа a и b, x...

Необработанное исключение по адресу (чтение памяти невозможно)
набросал код, даже рабочий: #include <stdlib.h> #include <stdio.h> #include <time.h> void...

Необработанное исключение win32 произошло в main.exe
Последняя строка вызывает отладчик с ошибкой Необработанное исключение win32 произошло в main.exe ...

22
S_el
2254 / 1700 / 356
Регистрация: 15.12.2013
Сообщений: 6,806
16.07.2014, 19:59 2
GetHelp, могу предложить такой вариант:

C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(void) {
    
char str1[10] = "test1_";
char str2[10] = "test2";
char* str3=strcat(str1,str2);
printf("%s\n",str3);
    return 0;
}
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.07.2014, 20:00  [ТС] 3
S_el, нет должны быть указатели
0
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,677
16.07.2014, 20:07 4
GetHelp, "test1_" - строковый литерал, неизменяемый.
можно так:
C
1
2
3
4
char* str1 = (char*)malloc(20);
strcpy(str1, "test1_");
const char* str2 = "test2";
char* str3 = strcat(str1, str2);
1
16.07.2014, 20:07
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.07.2014, 20:09  [ТС] 5
Jewbacabra, литерал это пока он в таком виде ("test1_"), а когда он присвоен str1, это уже указатель на строку, и он по идее вполне должен изменяться...
0
S_el
2254 / 1700 / 356
Регистрация: 15.12.2013
Сообщений: 6,806
16.07.2014, 20:13 6
Лучший ответ Сообщение было отмечено GetHelp как решение

Решение

GetHelp, функция strcat (s, t), присоединяет строку t к концу строки s ,в вашей str1 нет места,чтобы к ней можно было присоединить str2.
1
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.07.2014, 20:15  [ТС] 7
S_el, а разве strcat не должна сама отвечать за перевыделение памяти? о_О я почему то думал что это так...
0
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,677
16.07.2014, 20:18 8
Цитата Сообщение от GetHelp Посмотреть сообщение
Jewbacabra, литерал это пока он в таком виде ("test1_"), а когда он присвоен str1, это уже указатель на строку, и он по идее вполне должен изменяться...
str1 указатель на НЕИЗМЕНЯЕМОЕ значение.
и strcat память не выделяет

C
1
2
char str[20] = "test" // тут test "копируется" в массив, и изменять символы строки (но не размер) можно
char* str = "test" // тут str указывает на константу, менять которую никак нельзя
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.07.2014, 20:19  [ТС] 9
Jewbacabra, что за бред с чего вы это взяли
0
S_el
2254 / 1700 / 356
Регистрация: 15.12.2013
Сообщений: 6,806
16.07.2014, 20:23 10
Цитата Сообщение от Jewbacabra Посмотреть сообщение
str1 указатель на НЕИЗМЕНЯЕМОЕ значение.
Как раз наоборот,неизменяемый второй параметр.

Цитата Сообщение от GetHelp Посмотреть сообщение
а разве strcat не должна сама отвечать за перевыделение памяти?
Нет.
0
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,677
16.07.2014, 20:25 11
GetHelp, этот бред из учебников по C

Добавлено через 1 минуту
S_el, я имел ввиду, что
C
1
char* str = "test";
str менять нельзя
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.07.2014, 20:25  [ТС] 12
Jewbacabra, указатель - самое что ни на есть изменяемое значение...
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.07.2014, 20:29  [ТС] 13
ладно клозаемся, проблема была в том что strcat не предусматривает перевыделения памяти... это печально, но это хотя бы ясно и понятно
0
S_el
2254 / 1700 / 356
Регистрация: 15.12.2013
Сообщений: 6,806
16.07.2014, 20:29 14
Цитата Сообщение от Jewbacabra Посмотреть сообщение
str менять нельзя
Почему это ведь просто указатель,он может указывать на что угодно.Вот например:
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
# include <string.h>
int main(void) {
    
char str1[10] = "test1_";
char* str = "test2";
printf("%s\n",str);
char* str4=strcat(str1,str);
str=str4;
printf("%s\n",str);
    return 0;
}
0
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,677
16.07.2014, 20:37 15
S_el, посмотри:
не рабочий вариант http://ideone.com/LZFK6F
рабочий вариант: http://ideone.com/OBK2ho
1
S_el
2254 / 1700 / 356
Регистрация: 15.12.2013
Сообщений: 6,806
16.07.2014, 20:40 16
Jewbacabra, так я и не спорю,все дело в выделяемой памяти,вот так тоже работать будет :

C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
# include <string.h>
int main(void) {
    
char str1[10] = "test1_";
char* newstr=str1;
char* str = "test2";
printf("%s\n",newstr);
char* str4=strcat(newstr,str);
printf("%s\n",newstr);
return 0;
}
0
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,677
16.07.2014, 20:43 17
S_el, да так будет работать, потому что newstr указывает на значение, которое можно изменять.
0
S_el
2254 / 1700 / 356
Регистрация: 15.12.2013
Сообщений: 6,806
16.07.2014, 20:45 18
Jewbacabra, надеюсь теперь все всем понятно
0
Vtulhu
425 / 379 / 200
Регистрация: 12.08.2011
Сообщений: 1,610
16.07.2014, 21:59 19
Если я правильно понял, чего топикстартеру надо. Только учти, что размер буфера должен быть как минимум суммой длин всех строк ПЛЮС еще место под нулевой символ. В идеале надо использовать strncat или strlcat.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <string.h>     // strcat
#include <stdio.h>      // puts
 
#define BUF_SIZE 11
 
int main(void)
{
    char* str1 = "test1";
    char* str2 = "test2";
    char buf[BUF_SIZE] = { '\0' }; // первый символ должен быть NUL
 
    strcat(buf, str1);
    strcat(buf, str2);
    
    puts(buf);
    return 0;
}
1
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.07.2014, 22:16  [ТС] 20
Vtulhu, да все уже решено сказал же
0
16.07.2014, 22:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2014, 22:16

Необработанное исключение по адресу 0x01374339: исправить код рекурсии
Дано задание (прикреплено), по которому нужно написать код в си через рекурсию. Сам код у меня...

Вызвано необработанное исключение: нарушение доступа для записи
// Str.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include...

Необработанное исключение по адресу 0x558B16B6 (msvcr110d.dll) в : 0xC0000005
Необработанное исключение по адресу 0x558B16B6 (msvcr110d.dll) : 0xC0000005: нарушение прав доступа...


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

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

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