C++ Can';t使用文字或12个字符打印字符串

C++ Can';t使用文字或12个字符打印字符串,c++,c-strings,C++,C Strings,首先,我们有一个字符串数组,我必须以这种方式打印这个数组,空格前的一个单词或前12个字符=一个字符串 例如,假设我们有字符串“hello world qwerty-----asd”,它必须打印为: hello world qwerty------ (12 characters without space) asd 因此,在任务中没有这个12个字符的条件是很容易做到的(我猜只是strtok函数),但是在这种情况下,我不知道该怎么做,我有主意,但它只能处理50%的输入,这是一个非常大和非常愚蠢的问

首先,我们有一个字符串数组,我必须以这种方式打印这个数组,空格前的一个单词或前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  && (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));
    }
}
int计数器=0;//文字计数器
int k1=0;//因为我还需要打印第三个单词的字母地址,所以我必须知道第三个单词在哪里
int jbegin=0,//第三个字的开头和结尾
jend=0;
对于(int k=0;k11 | | lastspace==0)){//如果12个字符没有空格-创建一个新字符串
printf(“\n”);
计数器++;
lastspace=j;
}
如果(计数器==3){
jend++;
}
printf(“%c”,*(*(arr+k)+j));//按字符打印
}
printf(“\n”);
}
如果(jend!=0&&jbegin!=0){
printf(“\n第三个单词的地址为:\n”);
for(int j=jbegin;j
我试图理解您的代码,但老实说,我不知道您在那里做什么。如果逐字符打印,则只需在遇到空格时添加换行符,并且需要跟踪已在同一行上打印的字符数

#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;
       }
   }
}
可以将打印字符限制为12个

否则有两个独立的数据字起始和行限制

  • 单词开始-需要跟踪从空白到单词字符的每次转换
  • 每当一个单词完成时=wordchar到空格
    • 自单词开始小于或等于12个字符。打印全字+新行
    • 大于12个字符。打印12个字符并转储剩余字符
  • 空格后跟空格-忽略

  • 你有什么理由不使用C++吗?您可以使用
    std::string
    ?“但它只适用于50%的输入”:您能描述50%的输入工作吗?他们有什么共同点?当你用调试器跟踪程序时,它在什么时候做了你意想不到的事情?@ScottHunter当字符串很长时,它不能正常工作,并且字符串中有超过一个12个字符没有空格序列。不管怎么说,我的代码都是胡说八道,因为它的大小和缺少字符串函数。@user463035818(可能类似)去掉for循环。使用while循环,只查找空格并打印单词。一旦开始工作,添加在12个字符处停止的条件。更容易调试部分工作的东西。一个更优雅的方式,谢谢你,小伙子,但是,抱歉我的可怕的C++技巧,我不完全理解Auto&C,不能编辑我的字符串数组(char *ARR)的代码。properly@Tovarisch我添加了一些没有
    auto
    的内容,但是,很抱歉,
    char**arr
    超出了我所能处理的范围而不会头晕。您需要将单独的行存储在另一个c字符串数组中?@Tovarisch您的原始代码和问题没有显示,何时、何地,甚至为什么您有一个
    char**arr
    。您需要做的就是解析一个字符串。你所能做的就是把给出的解决方案变成一个函数,然后将单个字符串传递给函数进行解析。不,我只需要打印它们,输入字符串的更改不是必需的,再次感谢你,现在由我来理解和调整它。再次感谢您,祝您好运@user463035818无需更改输入字符串。你知道函数是什么吗?哦,谢谢你提供的信息,我也会试试你的解决方法,小伙子
    size_t len = std::strlen(x);
    for (size_t i = 0; i < len; ++i) {
        c = x[i];
        ...
    }
    
    printf( "%.12s\n", wordStart);