我试图为Ti-89计算器做一个带线路替换器的空间,这样我就可以打印线条而不会因为水平字符长度而被剪切。他们通常看起来像这样
This is a pretty long test
ing for the Ti89 Calculator
我希望他们看起来像这样
This is a pretty long
testing for the Ti89
Calculator
我尝试使用此代码
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);
}
但似乎只是忽略它并像第一个例子那样继续打印它。
答案 0 :(得分:3)
您没有插入回车。
替换
string[c] == '\n';
使用
string[c] = '\n';
答案 1 :(得分:0)
如Till所说,你没有插入回车。这条线
string[c] == '\n';
需要
string[c] = '\n';
差异是一个&#34;等于&#34;标志与两个。
原因是&#34; ==&#34;是一个条件运算符,其值为true或false,而&#34; =&#34;是赋值运算符,它将值设置为变量。
答案 2 :(得分:0)
需要处理整个字符串。
记录当前输出字符位置,以便在输出下一个单词时检查是否超出指定的宽度 像这样:
#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;
}