Та же первая и последняя буква в массиве C

#arrays #c #string #character

#массивы #c #строка #характер

Вопрос:

Мое задание-написать программу на языке Си, в которой пользователь вводит предложение, и программа проверяет, есть ли слова, начинающиеся и заканчивающиеся одной и той же буквой (например, e y e, r oa r, s o s и т. Д.). Я написал это, и я не уверен, что это сработает

У меня также есть ошибка: используется неинициализированная локальная переменная ‘p2’. Может кто-нибудь сказать, где я должен его инициализировать?

Может быть, кто-нибудь может добавить несколько советов по улучшению?

 #include lt;stdio.hgt; #includelt;stdlib.hgt; #include lt;string.hgt; #define MAX 100  int main() {  system("chcp 1251");  char arr[MAX];  char* p1, *p2;  int sym, i;  printf("nt Enter your sentence(use .(dot) or Enter to finish input):");  while ((sym = getchar()) != '.' amp;amp; sym != 'n' amp;amp; i lt; MAX)  {  arr[i  ] = sym; //symbols to array  arr[i] = '0';   }   p1 = arr; //pointer for 1st symbol  for (i = 0; i lt; MAX; i  )  {  if (arr[i] == ',' || arr[i] == ' ') //finding a word  {  *p2 = arr[i--];  if (*p1 = *p2) //if first and last letters are equal  {  printf("%s", arr);  }  if (arr[i  ] == ',' || arr[i  ] == ' ')  {  *p1 = arr[i   2];  }  *p1 = arr[i  ];  }  }   return 0; }```  

Комментарии:

1. if (*p1 = *p2) не сравнивает, он копирует значение из *p2 в *p1 .

Ответ №1:

Переменная i должна быть инициализирована, i = 0; в противном i случае начинается с некоторого случайного значения. Вы можете просто использовать fgets для чтения ввода, а затем использовать strcspn для удаления последнего n символа.

 *p2 = arr[i--];  

p2 объявляется как указатель и снова не инициализируется. Он указывает на какой-то случайный адрес в памяти, и его пока не следует разыменовывать.

Если у вас недостаточно опыта работы с указателями, вы можете просто использовать индексацию в стиле массива.

 for (i = 0; i lt; MAX; i  )...  

MAX это максимальное количество символов, в которых можно хранить arr . Но длина строки может быть меньше, это определяется strlen . Пример:

 char arr[MAX];  printf("input:"); fgets(arr, sizeof(arr), stdin); arr[strcspn(arr, "n")] = 0;  size_t len = strlen(arr); if(len == 0) return 0; if (arr[0] == arr[len - 1])  printf("first and last match"); else  printf("first and last don't match");  

Если в нем более одного слова arr , вы можете использовать strtok его для перехода arr к словам, проверяя каждое слово по отдельности.