我有我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverseSentence();
int main(void){
int i = 0;
int lineLength = 0;
char string[100];
printf("Enter the output line length : \n");
scanf("%d", &lineLength);
printf("Enter your text (control-d to exit) : ");
reverseSentence();
return 0;
}
void reverseSentence(){
while(!feof(stdin)){
char c;
scanf("%c", &c);
if( c != '\n'){
reverseSentence();
printf("%c", c);
}
}
}
我需要输入要输入的字符串(见图片)。
我可以让字符串向后打印,但我不能让它只打印10个(或其他说明的)字符。如何只使用10个字符的行长度输出字符串?
答案 0 :(得分:0)
为了继续使用你的方法,你需要跟踪你打印的字符数,以便决定何时应该打印一个新行,字符数将是从用户收到的输入和初始值第一次调用时,当前计数值为零
void reverseSentence(int char_count, int current_count){
while(!feof(stdin)){
char c;
scanf("%c", &c);
if( c != '\n'){
current_count++;
if(char_count == current_count){
printf("\n");
current_count = 0;
}
reverseSentence(char_count, current_count);
printf("%c", c);
}
}
}
答案 1 :(得分:0)
虽然我确信您试图撤消行的文字而不是句子,但
Enter the output line length: 10
Enter your text (Enter to exit)
和您的标题“如何打印输出行长度?”,如果您只是想查找将检查句子结尾的内容(例如{ {1}}),可以毫不费力地修改以下内容。
你遇到问题的地方似乎是“我怎么知道包裹线中的字符数是多少?”需要知道每行输出前缀有多少个空格。
任何行 wrap 场景的关键是基本上使用滑动窗口来包含适合每个换行长度字符的字符(说明单词之间的空格)。意思是,你有一个包装长度,但是这个字符数可以在一个单词的中间结束,所以你需要跟踪在达到该数量的字符之前发生的最后一个自然中断(通常是一个空格)。 (然后输出适合的单词)。
您的下一组或多个字符不是从您当前的计数器开始,而是在刚刚打印的单词后面的下一个非空格字符处开始。您对下一组输出单词的计数从那里开始。你实际上是在你的字符串中滑动一个换行长度字符的窗口,输出适合你的滑动窗口的单词,然后滑动窗口来捕获下一组单词。
你是否反转窗口内的文字是一个相对微不足道的事情。从窗口的开头到结尾打印,或从结尾打印到开头。
问题的另一个方面是确定每个反向词组的前缀有多少个空格。这就是窗口中的字符数很重要的地方。
处理窗口和长度的简单方法就是使用一对指针。将开始指针(比如说'.'
)设置为窗口中的起始字符,将结束指针(比如sp
)设置为每个单词中的最后一个字符,当你沿着字符串向下工作时。当您达到换行长度字符数时,您知道要输出的字词数为ep
个字符。然后,您知道自己需要ep - sp
个wrap_length - (ep - sp)
作为行的前缀。
将这些概念放在一起,您可以使用类似于以下内容的方式包装和反转您的输入:
spaces
(注意:该函数还会检查以 void str_word_wrap_rev (char *buf, int n)
{
char *p = buf, /* pointer to current char */
*sp = buf, /* pointer to start of line to print */
*ep = buf; /* pointer to end of line to print */
size_t l = 0, /* length of segment (no. of chars */
pre = 0; /* prefix - number of spaces */
for (; *p && *p != '\n'; p++) { /* loop over each char (omit '\n')*/
if (*p == ' ') /* if space, set ep */
ep = p;
if (p - sp >= n) { /* if limit from start reached */
l = ep - sp; /* compute number of characters */
pre = n - l; /* get leading spaces required */
while (pre--) /* output spaces */
putchar (' ');
while (l--) /* loop over chars ep -> sp (reverse) */
putchar (sp[l]);
putchar ('\n'); /* tidy up with '\n' */
sp = ++ep; /* set start to next after end */
ep = ++p; /* set end to next after current */
}
} /* handle last line of chars */
l = p - sp; /* number of chars */
pre = n - l; /* number of spaces */
if (*p == '\n') /* if buf ends with '\n', decrement */
p--;
while (pre--) /* output spaces */
putchar (' ');
while (p >= sp) /* output chars */
putchar (*p--);
putchar ('\n');
}
结尾的字符串,以允许'\n'
直接从其中一个面向行的输入函数,例如buf
或POSIX fgets
)
与您的示例类似的简短示例可能是:
getline
示例使用/输出
#include <stdio.h>
#define MAXC 1000
void str_word_wrap_rev (char *buf, int n)
{
char *p = buf, /* pointer to current char */
*sp = buf, /* pointer to start of line to print */
*ep = buf; /* pointer to end of line to print */
size_t l = 0, /* length of segment (no. of chars */
pre = 0; /* prefix - number of spaces */
for (; *p && *p != '\n'; p++) { /* loop over each char (omit '\n')*/
if (*p == ' ') /* if space, set ep */
ep = p;
if (p - sp >= n) { /* if limit from start reached */
l = ep - sp; /* compute number of characters */
pre = n - l; /* get leading spaces required */
while (pre--) /* output spaces */
putchar (' ');
while (l--) /* loop over chars ep -> sp (reverse) */
putchar (sp[l]);
putchar ('\n'); /* tidy up with '\n' */
sp = ++ep; /* set start to next after end */
ep = ++p; /* set end to next after current */
}
} /* handle last line of chars */
l = p - sp; /* number of chars */
pre = n - l; /* number of spaces */
if (*p == '\n') /* if buf ends with '\n', decrement */
p--;
while (pre--) /* output spaces */
putchar (' ');
while (p >= sp) /* output chars */
putchar (*p--);
putchar ('\n');
}
int main (void) {
char buf[MAXC] = "";
int n = 0;
/* read/validate n */
printf ("Enter the output line length: ");
if (scanf ("%d%*c", &n) != 1) {
fprintf (stderr, "error: invalid conversion for 'n'\n");
return 1;
}
/* read/validate line using fgets for line-oriented input */
printf ("Enter your text (Enter to exit)\n");
if (!fgets (buf, MAXC, stdin) || *buf == '\n') {
fprintf (stderr, "error: EOF or empty string\n");
return 1;
}
putchar ('\n');
str_word_wrap_rev (buf, n); /* reverse and wrap */
for (int i = 1; i <= n; i++)
putchar ('0' + i % 10);
putchar ('\n');
return 0;
}
仔细看看,如果您有其他问题,请告诉我。
(注意:这可能有助于简单地在一张纸上写下您的输入并在字符串下方绘制开始,结束和当前字符指针并手动移动它们以准确了解正在拍摄的内容的地方。)