0

私のプロジェクトの 1 つを手伝ってもらいたいです。私はグラフィックデザインの学生で、プログラミングの経験はほとんどありません。使用されている特定のハッシュタグに基づいて twitter で作成されたツイートを識別し、それらを自動的に印刷するサーモ ミニ プリンター用のプログラムを作成しました。

ただし、これは 32 文字の行の長さに基づいており、単語全体を別の行に移動するのではなく、単語を半分に分割します。私の友人はワードラッピングを提案しましたが、私を助けるものをオンラインで見つけることができず、私が見つけたほとんどのコードは c++ または c# 用である傾向があります。

これまでのコードは以下にあります。

// Build an ArrayList to hold all of the words that
// we get from the imported tweets

ArrayList<String> words = new ArrayList();
Twitter twitter;
import processing.serial.*;

Serial myPort;  // Create object from Serial class
int val;        // Data received from the serial port

void setup() {
    String portName = Serial.list()[0];
    myPort = new Serial(this, portName, 9600);
    //Set the size of the stage, and the background to black.
    size(550,550);
    background(0);
    smooth();

    //Make the twitter object and prepare the query
    twitter = new TwitterFactory(cb.build()).getInstance();
}

void draw() {

    Query query = new Query("#R.I.P");
    query.setRpp(1);

    //Try making the query request.
    try {
        QueryResult result = twitter.search(query);
        ArrayList tweets = (ArrayList) result.getTweets();

        for (int i = 0; i < tweets.size(); i++) {
            Tweet t = (Tweet) tweets.get(i);
            String user = t.getFromUser();
            String msg = t.getText();
            Date d = t.getCreatedAt();
            println("Tweet by " + user + " at " + d + ": " + msg);
            msg = msg.replace("\n"," ");
            myPort.write(msg+"\n");
        };
    }
    catch (TwitterException te) {
        println("Couldn't connect: " + te);
    };
    println("------------------------------------------------------");
    delay(20000);
}
4

1 に答える 1

0

線の長さがあるので、そこまで大変ではありませんが…

一度に 1 文字ずつ文字列を反復処理します。スペースが表示された場合は、その位置を例として保存しますlast_space。反復が最大行長を超える場合は、その位置に移動しlast_spaceてスペースを改行に変換し、位置カウンターをゼロにリセットして、その位置からやり直します。


たぶん、次のように実装します。

#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define LINE_LENGTH 32

char text[256] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer ac risus elit, id pellentesque magna. Curabitur tempor rutrum enim, sit amet interdum turpis venenatis vel. Praesent eu urna eros. Mauris sagittis tempor felis, ac feugiat est elementum sed. Praesent et augue in nibh pharetra egestas quis et lectus. Lorem ipsum.";

static void wrap(char *text, const int length)
{
    int last_space = 0;
    int counter = 0;

    for (int current = 0; text[current] != '\0'; current++, counter++)
    {
        if (isspace(text[current]))  // TODO: Add other delimiters here
            last_space = current;

        if (counter >= length)
        {
            text[last_space] = '\n';
            counter = 0;
        }
    }
}

int main(void)
{
    printf("Before wrap:\n%s\n", text);

    wrap(text, LINE_LENGTH);

    printf("\nAfter wrap:\n%s\n", text);

    return 0;
}

重要な注意: この関数は、引数wrapとして渡されたバッファを変更します。textつまり、リテラル文字列は読み取り専用であるため、処理できません。スペースを改行に置き換えることで機能します。関数を変更して複数の文字を追加する場合、より良い解決策は、変更された文字列を保持するのに十分な大きさの新しいバッファーを (再) 割り当てることです。

于 2013-03-30T15:15:43.577 に答える