#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
к словам, проверяя каждое слово по отдельности.