C/C++

Как убрать пробел перед ответом (Си)

При работе программы (на си) перед ответом появляется пробел. Как это можно убрать?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define len 25
int main()
{
int b=1; //количество слов
char t[256]= { 0 } ,
**a; //массив для сортировки слов
printf("\nЛабораторная работа №3. Дана строка слов, разделённых пробелами. Расположите в строке слова в порядке возрастания их длины.\nАвтор: студент гр.РИ-111121 Мухаметшин Н.И. 2022г.\n");

//создать массив для 1-й строки
a=(char**)malloc(b*sizeof(char*));

//создать для массива первую
//строку длиной len:
a[0]=(char*)malloc(len*sizeof(char));

printf("Введите текст:\n");
fgets(t,sizeof(t),stdin);

//изменить последний символ введённого текста с \n на \0
t[strlen(t)-1]='\0';

//выбрать первое слово в тексте
char *w=strtok(t," ");

//далее в цикле выбирать все слова и сохрянять в массив, увеличивая массив для каждого выбранного слова из текста
while(w!=NULL)
{ //while начало цикла

//обнулить ячейки места для хранения нового слова в массиве, чтобы не было мусора после слова
memset(a[b-1],'\0',len*sizeof(char));

//скопировать слово в массив
strcpy(a[b-1],w);

//увеличить массив на 1
a=(char**)realloc(a,++b*sizeof(char*));

//добавить место для новой строки в массиве
a[b-1]=(char*)malloc(len*sizeof(char));

//выбрать следующее слово из введённого текста
w=strtok(NULL," ");
} //while конец цикла

//сортировка слов в порядке возрастания их длины
for(int i = 0; i < b; i++)
for(int j = 0; j < b; j++)
{
if(i!=j && strlen(a[i])<strlen(a[j]))
{ //if начало
char t[len]= { 0 } ;
strcpy(t,a[j]);
strcpy(a[j],a[i]);
strcpy(a[i],t);
} //if кронец
}
//вывод результата сортировки слов
printf("\nСлова в порядке возрастания их длины:\n");
printf("\n");
for(int i = 0; i < b; i++)
printf("%s ",a[i]);
//освобождение памяти от строк
for(int i = 0; i < b; i++)
free(a[i]);
//освобождение памяти от массива
free(a);
return 0;
}
Ferenc Kerekes
Ferenc Kerekes
86
Этот пробел возникает из-за того, что у тебя в массиве a находится слово нулевой длины - именно оно первым и выводится. Разбирайся, почему и как оно туда попадает.
Stas Bayev
Stas Bayev
58 612
Лучший ответ
Ferenc Kerekes В этом и дело
Не могу понять как убрать
Можете помочь пожалуйста?
#include <stdio.h>
#include <string.h>
using namespace std;

void transfer(char* in, char* out, int pos)
{
int pos_out = strlen(out);
while (in[pos]&&in[pos]!=' ')
{
out[pos_out] = in[pos];
in[pos] = ' ';
pos++; pos_out++;
}
pos_out != 255 ? out[pos_out] = ' ' : NULL;
}

int main()
{
char t[256]{};
char o[256]{};
int max_len{}, max_pos{}, len{}, pos{};
fgets(t, 256, stdin);
do {
max_pos = 0, max_len = 0; pos = 0;
do
{
if (t[pos] != ' ' && t[pos]) len++; else { max_len < len ? max_len = len, max_pos = pos - len : NULL; len = 0; }
} while (t[pos++]);
max_len ? transfer(t, o, max_pos) : void();
} while (max_len);
o[strlen(o) - 1] = 0; //********************************
puts("");
printf_s("%s", o);
}

Код упорядочивает, но какого-то хрена не удаляет корректно незначащий пробел в конце (строка помеченная ***************). Вместо этого добавляет переход на новую строку. Или возможно функции не правильно работают на си++ компиляторе. Короче плохая идея писать код си на с++ основе )
UPD: Попробовал этот же код снова - перестало лишнее добавлять. Полтергейст какой-то...
UPD2: Не добавляло если два раза подряд
printf_s("%s", o);
Какой-то глюк.
Ставишь перед первой J курсор и нажимаешь Backspace
Бэтмэн ) К
Бэтмэн ) К
9 997
Эта программа вообще не фонтан. strtok сама по себе относится к функциям, которые лучше не использовать. Плюс все остальное... Вот тут один из моих старых примеров по разбиению строки на слова: https://pastebin.com/zL4aTrYE Его можно слегка доработать, чтобы функция get_word возвращала еще длину выделенного слова и сразу сохранять указатели на выделенные слова в массиве структур вида
struct Word
{
char* word;
size_t len;
}
Все что нужно будет сделать потом - отсортировать этот массив структур по длине ( см. https://pastebin.com/SnHhzfJL ), посчитать сколько всего памяти нужно выделить под все слова сразу, не забывая о пробелах, выделить кусок нужного объема и пройтись по массиву структур, дописывая слова в конец выделенного блока.
Убрать \n?