2016-07-08 26 views
1

Ich versuche, einen Platz mit Line Replacer für Ti-89 Taschenrechner zu tun, so dass ich Zeilen drucken kann, ohne dass sie wegen der horizontalen Zeichenlänge geschnitten werden. Sie würden sehen normalerweise wie soPlatz durch Zeilenumbruch ersetzen

This is a pretty long test 
ing for the Ti89 Calculator 

und ich möchte sie aussehen so

This is a pretty long 
testing for the Ti89 
Calculator 

Ich versuchte es mit diesem Code zu tun

void _print_line(char* string) 
{ 
     int k = strlen(string); 
     if(k > 26) 
     { 
       int n = 0; 
       int c = 25; 
       while(n == 0) 
       { 
         if(string[c] == 32) 
         { 
           n = 1; 
         } 
         else 
         { 
           c--; 
         } 
         if(c <= 0) 
         { 
           n = 2; 
         } 
       } 
       if(n == 1) 
       { 
         string[c] == '\n'; 
       } 
     } 
     printf("%s\n", string); 
} 

Aber es scheint einfach zu ignorieren es und drucken Sie es wie das erste Beispiel.

+3

nicht Ihr Problem, aber zur besseren Lesbarkeit (und Portabilität) bitte 'if (string [c] == 32) ändern' auf 'if (string [c] == '‚) ' . –

+0

OT: 'strlen()' gibt 'size_t', nicht' int' zurück. – alk

Antwort

3

Sie fügen den Wagenrücklauf nicht ein.

ersetzen string[c] == '\n';

Mit string[c] = '\n';

0

Wie Bis gesagt, Sie den Wagenrücklauf nicht einlegen. Die Linie

string[c] == '\n'; 

benötigt

string[c] = '\n'; 

Mit dem Unterschied sein als ein "gleich" im Vergleich zu zwei unterzeichnen.

Der Grund ist, weil "==" ein bedingter Operator ist, der entweder wahr oder falsch auswertet, während "=" der Zuweisungsoperator ist, der einen Wert auf eine Variable setzt.

0

Es muss für die gesamte Zeichenfolge verarbeitet werden.

Halten Sie eine Aufzeichnung der aktuellen Ausgabezeichenposition, um zu überprüfen, ob die angegebene Breite überschritten wird, wenn Sie das nächste Wort ausgeben.
wie folgt aus:

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

#define DISP_OUT stdout 
#define DISP_WIDTH 26 

int disp_one(char ch){ 
    static int pos; 
    fputc(ch, DISP_OUT); 
    if(ch == '\n') 
     pos = 0; 
    else 
     ++pos; 
    if(pos == DISP_WIDTH){ 
     fputc('\n', DISP_OUT); 
     pos = 0; 
    } 
    return pos; 
} 

typedef enum word_break { 
    KEEP, BREAK 
} WORD_BREAK; 

void disp(const char *str, WORD_BREAK word_break){ 
    static int pos; 

    switch(word_break){ 
    case BREAK: 
     while(*str){ 
      pos = disp_one(*str++); 
     } 
     break; 
    case KEEP: 
     while(*str){ 
      if(isspace((unsigned char)*str)){ 
       pos = disp_one(*str++); 
       continue; 
      } 
      const char *end = str;//end : word end (find delimiter) 
      while(*end && !isspace((unsigned char)*end)) 
       ++end; 

      int len = end - str;//length of next output word 
      if(pos + len >= DISP_WIDTH && len < DISP_WIDTH){ 
       pos = disp_one('\n'); 
      } 
      while(str < end){ 
       pos = disp_one(*str++); 
      } 
     } 
     break; 
    } 
} 

int main(void){ 
    char *text = "This is a pretty long testing for the Ti89 Calculator"; 

    disp(text, BREAK); 
    disp("\n", BREAK); 
    disp(text, KEEP); 
    return 0; 
} 
+0

[DEMO] (http://ideone.com/NJUcy1) – BLUEPIXY