Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2012, 15:41   #1
фдуч320388
 
Регистрация: 06.09.2012
Сообщений: 6
По умолчанию Разборки с Си

Не могу понять почему ошибка в коде:
Код:
#include <stdio.h>
#include <string.h>

char * a[1][2] = { {"1. ААААА +","2. БББ"} };

int main(void)
{

int i = 0;
    printf("First String :    %s\n", *&a[0][0]);
    while (a[0][0][i] != '\0') 
    {             
      if (a[0][0][i] == '+') a[0][0][i] =' ';  
      i++;
     }
    printf("New String :    %s\n", a[0][0]);

  return 0;
}
Он вьідает
Цитата:
First String : 1. ААААА +
Segmentation fault
а должен
Цитата:
First String : 1. ААААА +
New String : 1. ААААА

Последний раз редактировалось Stilet; 06.09.2012 в 17:22.
фдуч320388 вне форума Ответить с цитированием
Старый 06.09.2012, 16:26   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Строки, создаваемые с помощью кавычек, лежат в области памяти, недоступной для изменения. Segmentation fault вылезает как раз из-за попытки изменить эти строки. Если Вам нужно их менять, скопируйте их себе в предварительно выделенную динамическую память.
Совет: объявляйте такие строки как const char *, чтобы увидеть ошибку еще на этапе компиляции.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 06.09.2012, 16:51   #3
фдуч320388
 
Регистрация: 06.09.2012
Сообщений: 6
По умолчанию

Спасибо, буду разбираться
фдуч320388 вне форума Ответить с цитированием
Старый 06.09.2012, 17:48   #4
фдуч320388
 
Регистрация: 06.09.2012
Сообщений: 6
По умолчанию

Вот, работает

Код:
#include <stdio.h>
#include <string.h>

char *a[1][2] = { {"1. ААААА +","2. БББ"} };

int main(void)
{

char fptr[32]; // буфер размером больше строки
memset(fptr, 0, sizeof(fptr));  // очистка буфера для вывода
strcpy(fptr, a[0][0]); // копир. строку в буфер

int i = 0;

    printf("First String :  %s\n",fptr);
    while (fptr[i] != '\0') 
    {     
	
        
      if (fptr[i] == '+') fptr[i] =' ';  
      ++i;
     }

    printf("New String : %s\n",fptr);
  return 0;
}
фдуч320388 вне форума Ответить с цитированием
Старый 06.09.2012, 18:19   #5
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Да, теперь правильно.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Появились признаки перегрева процессора после разборки, чистки ПК от пыли и его сборки. В чём может быть причина? Вадим Мошев Компьютерное железо 6 23.06.2012 20:39
Разборки со фреймами Zmejka_Gorynka HTML и CSS 1 17.03.2009 15:49