Предположим, что у меня есть массив строк, который выглядит так: Alphabet Как вы можете видеть, это алфавит, представленный символом #. Цель программы - показать письмо (которое поступает от ввода) с помощью #.Получение одиночного символа из строкового массива в C
Таким образом, если вход = Е, я должен буду печатать E
Если письмо не beetwen [A-Z] или [A-Z], я должен напечатать знак вопроса (сделанный с #). Нам дается T: сообщение для кода H: высота буквы (количество строк), L: длина букв и ROW: последовательность строк, которые создают алфавит с #.
Так что я действительно получил часть уже закодированной программы. Но моя проблема заключается не в том, как разобраться в этом. Дело в том, что я только что узнал указатели (основное использование), и я не понимаю, как обращаться с ними в более сложном (для меня, это сложном) пути.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/**
* Auto-generated code below aims at helping you parse
* the standard input according to the problem statement.
**/
int main()
{
int L;
scanf("%d", &L); fgetc(stdin);
int H;
scanf("%d", &H); fgetc(stdin);
char T[257];
fgets(T, 257, stdin);
char elements[H][sizeof(T)];
char *pointer, *Pelements[H];
pointer = T;
for (int i = 0; i < H; i++) {
char ROW[1025];
fgets(ROW, 1025, stdin);
// given by the program
strcpy(elements[i], ROW);
Pelements[i] = &elements[i];
// now i got the address of every first character of a string
}
while(*pointer != '\0'){
if(*pointer >='a' && *pointer <= 'z' || *pointer >='A' && *pointer <= 'Z'){
int temp= ((*pointer) - 'A');
if(temp <= 25){
for(int i=0; i<H; i++){
int index= temp*L; // getting the position where to start to print
for(int j=0; j<L; j++){
printf("%s " , *Pelements+index);
Pelements[i]++; //could have used index++
}
}
}
}
else{
printf("?");
}
pointer++;
}
return 0;
}
Программа не завершена (я не обработал [а-г]) на самом деле я пытаюсь использовать его только заглавными буквами.
ПРОБЛЕМА: Он продолжает возвращать «ошибку сегментации» или дает мне # в случайных позициях. Спасибо заранее.
Что вы видите, когда вы кладете это в отладчике и шагнула код по одной строке за раз? Каковы были значения 'L' и' H'? – abelenky
'strcpy (элементы [i], ROW)' копирует то, что может быть длиной до 1025 байт, в буфер из 257 байт; потенциального переполнения буфера. –
H = 5 и L = 4. он несколько раз повторял ###. И фактически ### - первая строка E в ASCII. – Emanuele