Не удается создать способ печати строк по словам / или в виде 12 символов

#c #c-strings

#c #c-строки

Вопрос:

Для начала у нас есть массив строк, я должен напечатать этот массив таким образом, чтобы одно слово перед пробелом или первые 12 символов = одна строка.

Например, допустим, у нас есть строка «hello world qwerty —— asd», она должна быть напечатана как :

 hello
world
qwerty------ (12 characters without space)
asd
  

Итак, будет легко обойтись без этого условия 12 символов в задаче (я думаю, просто функция strtok), но в этом случае я не знаю, что делать, у меня есть идея, но она работает только с 50% входных данных, вот она, она довольно большая иочень глупо, я знаю о строковых функциях, но не могу создать алгоритм, спасибо:

     int counter = 0;// words counter
int k1 = 0;// since I also need to print addresses of letters of third word, I have to know where 3rd word is
int jbegin=0,// beginning and end of 3rd word
    jend=0;
for (int k = 0; k < i; k  ) {
    int lastspace = 0;//last index of new string( space or 12 characters)
    for (int j = 0; j < strlen(*(arr   k)); j  ) {
        if (*(*(arr   k)   j) == ' ' ) {  //if space
            printf("n");
            lastspace = j;
            counter  ;
            if ( counter == 3 ) { // its only for addreses, doesnt change anything 
                k1 = k;
                jbegin = j   1;
                jend = jbegin;
            }
        }
         if (j % 12 == 0  amp;amp; (j-lastspace>11 || lastspace==0) ) { // if 12 characters without space - make  a new string
            printf(" n");
            counter  ;
            lastspace = j;
        }
        if (counter==3 ) { 
            jend  ;
        }
        printf("%c", *(*(arr k)   j)); // printing by char
    }
    printf("n ");
}
if ( jend!=0 amp;amp; jbegin!=0 ) {
    printf("n Addreses of third word are :n");
    for (int j = jbegin; j < jend; j  ) {
        printf("%p n", arr   k1   j);
        printf("%c n", *(*(arr   k1)   j));
    }
}
  

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

1. есть ли какая-либо причина, по которой вы не используете c ? можете ли вы использовать std::string ?

2. «но это работает только с 50% входных данных»: можете ли вы охарактеризовать 50%, которые работают? Что у них общего? Когда вы отслеживаете программу с помощью отладчика, в какой момент он делает то, чего вы не ожидали?

3. @ScottHunter это не работает должным образом, когда строка довольно длинная, и в строке более 12 символов без пробелов. И в любом случае, мой код — дерьмо собачье, из-за размера и отсутствия строковых функций.

4. @user463035818 русское образование похоже )

5. Избавьтесь от цикла for. Используйте цикл while, который просто ищет пробел и печатает слова. Как только это сработает, добавьте условие остановки на 12 символах. Легче отлаживать то, что частично работает.

Ответ №1:

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

 #include <iostream>
int main() {
   char  x[] = "hello world qwerty------asd";
   int chars_on_same_line = 0;
   const int max_chars_on_same_line = 12;
   for (autoamp; c : x) {
       std::cout << c;
         chars_on_same_line;
       if (c == ' ' || chars_on_same_line == max_chars_on_same_line){
           std::cout << "n";
           chars_on_same_line = 0;
       }
   }
}
  

Если по какой-то причине вы не можете использовать auto циклы for и rage, тогда вам нужно получить длину строки и использовать индекс, как в

 size_t len = std::strlen(x);
for (size_t i = 0; i < len;   i) {
    c = x[i];
    ...
}
  

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

1. Гораздо более элегантный способ, спасибо, парень, но, извините за мои ужасные навыки в c , я не до конца понимаю auto amp; c и не могу правильно отредактировать этот код для моего массива строк (char ** arr)

2. @Tovarisch я добавил кое-что без auto , но, извините, char **arr это выходит за рамки того, с чем я могу справиться, не испытывая головокружения. Вам нужно сохранить отдельные строки в другом массиве c-строк?

3. @Tovarisch Ваш исходный код и вопрос не показывают, когда, где или даже почему у вас есть char **arr . Все, что вы просите, это проанализировать строку. Что вы могли бы сделать, так это принять данное решение, сделать его функцией и передать отдельную строку функции для анализа.

4. Нет, я должен только их распечатать, изменения во входных строках не требуются, еще раз спасибо, теперь мне нужно понять и адаптировать его. Еще раз спасибо, удачи, человек @user463035818

5. Нет необходимости изменять входные строки. Вы знаете, что такое функции?

Ответ №2:

 printf( "%.12sn", wordStart);
  

можно ограничить печатные символы до 12.

В противном случае существует 2 независимых начала слова данных и ограничения строки.

  1. word starts — необходимо отслеживать каждый переход от пробела к слову char.
  2. всякий раз, когда слово завершено = wordchar в пробел
    • меньше или равно 12 символам с момента запуска word. Выведите целое слово новую строку.
    • больше 12 символов. Выведите 12 символов и сбросьте остальные.
  3. пробелы, за которыми следуют пробелы — игнорировать

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

1. О, спасибо за информацию, я тоже попробую твой способ решения, парень