#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 независимых начала слова данных и ограничения строки.
- word starts — необходимо отслеживать каждый переход от пробела к слову char.
- всякий раз, когда слово завершено = wordchar в пробел
- меньше или равно 12 символам с момента запуска word. Выведите целое слово новую строку.
- больше 12 символов. Выведите 12 символов и сбросьте остальные.
- пробелы, за которыми следуют пробелы — игнорировать
Комментарии:
1. О, спасибо за информацию, я тоже попробую твой способ решения, парень