Не удается распечатать строки по словам / или как 12 символов - PullRequest
1 голос
/ 11 апреля 2019

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

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

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

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

    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  && (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 && 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));
    }
}

Ответы [ 2 ]

1 голос
/ 11 апреля 2019
printf( "%.12s\n", wordStart);

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

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

  1. слово начинается - каждый переход от пробела к словусимвол должен быть отслежен.
  2. всякий раз, когда слово завершено = wordchar к пробелу
    • меньше или равно 12 символам с начала слова.Вывести целое слово + новую строку.
    • больше 12 символов.Выведите 12 символов и оставьте дамп.
  3. пробел, затем пробел - игнорируйте
1 голос
/ 11 апреля 2019

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

#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 (auto& 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 и основаны на ярости для циклов, тогда вам нужно получить длину строки и использовать индекс, как в

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