K&R exercise 3.3 - C (СИ)
Формулировка задачи:
Упражнение 3.3. Напишите функцию expand(s1, s2), заменяющую сокращенную запись наподобие a-z в
строке s1 эквивалентной полной записью abc. . . xyz в s2. В s1 допускаются буквы (прописные и строчные) и
цифры. Следует уметь справляться с такими случаями, как a-b-c, a-z0-9 и -а-b. Считайте знак - в начале или в
конце s1 обычным символом минус
Что-то у меня совсем далеко(
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main()
{
int c, i;
char a[30], b[30];
for (i = 0; (a[i] = getchar()) != EOF; i++)
;
a[i] = '\0';
for (i = 0; a[i] != '\0'; i++)
printf("%c", a[i]);
expand (a, b);
printf("b: ");
for (i = 0; b[i] != '\0'; i++)
printf("%c", b[i]);
return 0;
}
void expand(char s1[], char s2[])
{
if (s1 == NULL || s2 == NULL) return;
int c,i,j,k = 0;
for (i = 0; i < (strlen(s1) - 2); i++)
{
c = s1[i]; j = i;
if (isdigit(c))
if ((s1[++i] == '-') && isdigit(s1[++i]) && (c - s1[i]) > 1)
for (; j <= i; j++)
{
s2[k++] = s1[j];
}
else
if ((s1[++i] == '-') && (!isdigit(s1[++i])) && (c - s1[i]) > 1)
for (; j <= i; j++)
{
s2[k++] = s1[j];
}
}
s2[k] = '\0';
}Решение задачи: «K&R exercise 3.3»
textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
/*Упражнение 3.3. Напишите функцию expand(s1, s2), заменяющую сокращенную запись наподобие a-z в
строке s1 эквивалентной полной записью abc. . . xyz в s2. В s1 допускаются буквы (прописные и строчные) и
цифры. Следует уметь справляться с такими случаями, как a-b-c, a-z0-9 и -а-b. Считайте знак - в начале или в
конце s1 обычным символом минус*/
void expand(char *, char *);
int main()
{
char s1[] = "-a-z-0-9a-b-c-d-i-o675-1-2-3g-l-k-4-0-";
char s2[BUFSIZ] = "";
expand(s1, s2);
puts(s2);
puts(s1);
return 0;
}
void expand(char *str1, char *str2)
{
char tmp, *b;
for(b = str1; *b; b++){
if(*b == '-'){
if(b == str1 || !*(b + 1))
*str2++ = *b;
else{
if((isalpha(*(b - 1)) && isalpha(*(b + 1))) || (isdigit(*(b - 1)) && isdigit(*(b + 1)))){
tmp = *(b - 1);
tmp++;
if(tmp > *(b + 1))
*str2++ = *b;
while(tmp < *(b + 1))
*str2++ = tmp++;
}
else
*str2++ = *b;
}
}
else
*str2++ = *b;
}
}
Объяснение кода листинга программы
- В функции main создаются две строки: s1 и s2.
- Строка s1 содержит сокращенную запись, а строка s2 предназначена для расширенной записи.
- Функция expand() вызывается для замены сокращенной записи на полную.
- В функции expand() используется цикл for для прохода по каждому символу в строке s1.
- Если текущий символ равен
-, то проверяется следующий символ. - Если следующий символ является буквой (прописной или строчной) и предыдущий символ также является буквой или цифрой, то выполняется замена.
- Для замены используется временная переменная tmp, которая увеличивается на единицу и затем добавляется в строку s2 до тех пор, пока не будет достигнуто значение следующего симвома.
- Если текущий символ не равен
-, то он просто добавляется в строку s2. - По завершении функции expand(), строка s2 будет содержать расширенную запись.
- В функции main выводится расширенная запись s2.
- Также выводится исходная сокращенная запись s1.
- Программа возвращает 0, что означает успешное выполнение.