О, нет, нет - SegFault:
Вы создаете указатель на строковый литерал с:
char *captFirstLetter = article[location];
Вы не можете изменять строковые литералы , на которые ссылаются указатели в article
. Ваша попытка изменить их, например,
captFirstLetter[0] = captFirstLetter[0] - 32 ;
Вызывает Неопределенное поведение и, скорее всего, немедленный SegFault. Строковые литералы хранятся в постоянной памяти и не могут быть изменены (на всех, кроме самых древних и неясных аппаратных средств)
Чтобы устранить проблему, убедитесь, что строки, на которые указывает article
, являются массивами, а не строковыми литералами. Например, объявите article
как двумерный массив достаточного размера:
char article[][8] = {"the", "a", "one", "some", "any"};
Кроме того, хотя вы правильно вычитаете 32
, чтобы перевернуть 6-й бит (бит нижнего регистра выключен), стандартная библиотека предоставляет макрос toupper()
в <ctype.h>
для обработки этого случая с надлежащими проверками, чтобы гарантировать изменение регистра ограничено строчными буквами. Например:
#include <ctype.h>
...
captFirstLetter[0] = toupper(captFirstLetter[0]);
Наконец, собрав его в коротком примере, объясняющем две проблемы выше, вы получите:
#include <stdio.h>
#include <ctype.h>
int main (void) {
char article[][8] = {"the", "a", "one", "some", "any"};
size_t n = sizeof article / sizeof *article;
int location = 2;
char *captFirstLetter = article[location];
captFirstLetter[0] = toupper(captFirstLetter[0]);
for (size_t i = 0; i < n; i++)
puts (article[i]);
}
Пример использования / Вывод
$ ./bin/cmplitp2a
the
a
One
some
any
Дайте мне знать, если у вас есть дополнительные вопросы.