#include <stdlib.h>
#include <stdio.h>

int main()
{
	const char* s = "  100 101010  11 1010 010 ";
	printf("Дана строка: %s\n", s);

	const char *shortest_start = NULL, *longest_start = NULL, *current_start = NULL;
	size_t shortest_len, longest_len;
	char* sum_str = NULL;

	for (const char *sp = s; ; sp++)
		switch (*sp)
		{
		case '\0': case ' ':
			if (current_start)
			{
				size_t current_len = sp - current_start;
				if (!shortest_start || current_len < shortest_len)
				{
					shortest_start = current_start;
					shortest_len = current_len;
				}
				if (!longest_start || current_len > longest_len)
				{
					longest_start = current_start;
					longest_len = current_len;
				}
				current_start = NULL;
			}
			if (!*sp) goto exit_loop;
			break;

		case '0': case '1':
			if (!current_start) current_start = sp;
			break;

		default:
			printf("Неожиданный символ %c (#%i).", *sp, (unsigned char)*sp);
			goto finally;
		}
exit_loop:

	if (!shortest_start || !longest_start)
	{
		printf("Слов нет.");
		goto finally;
	}

	printf("Самое длинное слово: %.*s\n", (int)longest_len, longest_start);
	printf("Самое короткое слово: %.*s\n", (int)shortest_len, shortest_start);

	sum_str = (char*)malloc(longest_len + 1);
	sum_str[longest_len] = '\0';
	for (size_t idigit = 0; idigit < longest_len; idigit++)
	{
		int digit = longest_start[longest_len - 1 - idigit] - '0';
		if (idigit < shortest_len) digit += shortest_start[shortest_len - 1 - idigit] - '0';
		sum_str[longest_len - 1 - idigit] = '0' + digit;
	}

	printf("Сумма чисел: %s\n", sum_str);

finally:
	free(sum_str);
	return 0;
}