Как отмечают другие, инициализации переменной keyword
либо как пустая строка или указатель на пустую строку буквального, в зависимости от определения типа string
. В любом случае, тогда справедливо оценить keyword[i]
только для i
, равного нулю; любое другое значение - для чтения или записи - выходит за пределы. Кроме того, в последнем случае (указатель на строковый литерал) вы не должны пытаться изменить массив keyword
пунктов.
Обратите внимание, в частности, что C не автоматически расширяет строки, если вы пытаетесь получить доступ к элементу без границ. Вместо этого попытка сделать это создает «неопределенное поведение», и общий способ проявления в таких случаях заключается в виде ошибки сегментации. Вы можете просмотреть ошибку сегментации, поскольку система ударяет по вашей программе, пытаясь получить доступ к памяти, которая ей не принадлежит.
Поскольку вы не знаете, априори как долго аргумент строка будет, прежде чем скопировать его, наиболее жизнеспособным типом для keyword
является char *
. Я буду использовать этот тип вместо string
в дальнейшем, для ясности.
Если вы действительно хотите, чтобы сделать копию аргумента, то самым простым способом сделать это является через для-цели функции strdup()
:
char *keyword = strdup(argv[1]);
Это выделяет достаточно памяти для копии его аргумент, включая терминатор, копирует его и возвращает указатель на результат. Затем вы обязаны освободить полученную память через функцию free()
, когда закончите с ней. Сделав копию таким образом, вы можете UPCASE каждый элемент на месте:
for (int i = 0, n = strlen(keyword); i < n; i++)
{
keyword[i] = toupper(keyword[i]);
printf("%c-- printing letters\n", keyword[i]);
}
Note, кстати, что дескриптор формата printf()
для одного символа является %c
, не %i
. Вы должны использовать это для печати символов как символов, а не их целых значений.
Это один из простейших способов написать код C для того, что вы пытаетесь сделать, хотя есть много вариантов.Единственный один я предлагаю вашему вниманию, чтобы не копию Аргумент у всех:
char *keyword = argv[1];
Если инициализировать keyword
таким образом, то вы не выделять какой-либо памяти или сделать копию; вместо этого вы установите keyword
, чтобы указать на ту же строку, что и argv[1]
. Вы можете изменить эту строку на месте (хотя вы не можете ее удлинить), при условии, что вам не нужно сохранять исходное содержимое.
Прежде чем я завершу это, я также должен заметить, что ваша программа не проверяет, действительно ли есть аргумент. В случае отсутствия (, т. Е.argc < 2
), argv[1]
либо содержит нулевой указатель (argc == 1
), либо не определен (argc == 0
; вы вряд ли когда-либо столкнетесь с этим). В любом случае ваша программа создает неопределенное поведение в этом случае, если она пытается использовать argv[1]
, как если бы это был указатель на допустимую строку. Сначала вы должны сначала проверить этот случай и завершить диагностическое сообщение, если нет аргументов программы.
'string keyword =" ";' вы выделили нулевое пространство для строки, которая будет скопирована, и когда у вас будет достаточно большое пространство, вы также должны написать терминатор строки 'nul', прежде чем вы сможете называть его строкой ». –
Что такое строка? Это C или C++? –
@IshayPeled: "*' string' * "most likes приходит из" * '# include' * "и кажется строкой' typedef char *; '...: -/ –
alk