将几个字符串输出为由 9 个字符分隔的选取框
Output several strings as a marquee separated by 9 characters
我一直在关注这个 post How to output a string in a marquee fashion? 来输出一个跑马灯。
我的问题是我有一个由多个字符串组成的字符串,由一个字符分隔,在本例中为 '-'
。选取框内的字符串到字符串需要 9 个空格的距离。
我试过这段代码,但结果不是预期的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
void customSleep( int seconds )
{
#ifdef _WIN32
Sleep( 1000 * seconds );
#else
sleep( seconds );
#endif
}
static char text[] = "STRING01-STRING02";
static char indexOfCharacterToPrint, i, currentStartPosition;
static char temp;
static char blanks;
static char imarquee;
int main() {
while (1) {
if (blanks == 0)
indexOfCharacterToPrint = (currentStartPosition + imarquee) % strlen(text);
temp = text[indexOfCharacterToPrint];
if (temp == '-') {
blanks++;
temp = ' ';
if (blanks == 9)
blanks = 0;
}
printf("%c", temp);
i++;
imarquee++;
if (imarquee == 16)
imarquee = 0;
if (i == 16) {
i = 0;
currentStartPosition++;
customSleep(1);
printf("\r");
}
}
}
预期输出为:
STRING01
TRING01 S
RING01 ST
ING01 STR
NG01 STRI
G01 STRIN
01 STRING
1 STRING0
STRING02
实际输出为
STRING01
TRING02TRING01
TRING02S
ING01 ST
ING02STRNG01
TRING02STRI
01 STRIN
02STRING1
TRING02STRING0
STRING02STRING01
TRING02STRING01
RING02ST
ING01 ST
我错过了什么?
你有东西可以玩。它使用相同大小的字符串。尝试修改它以使用任何大小的字符串(+边界大小写)
#define MAX(a,b) ((a) > (b) ? (a) : (b))
void foo(char *words[], size_t distance)
{
size_t s1len = strlen(words[0]);
size_t s2len = strlen(words[1]);
for(size_t index = 0; index < MAX(s1len, s2len) + 1; index++)
{
for(size_t letter = index; letter < s1len; letter++)
{
if(letter < s1len) printf("%c", words[0][letter]);
else printf(" ");
}
for(size_t space = 0; space < distance; space++)
printf(" ");
for(size_t letter = 0; letter < s2len - (s1len - index); letter++)
{
if(letter < s1len) printf("%c", words[1][letter]);
else printf(" ");
}
printf("\n");
}
}
int main(void)
{
foo((char *[]){"123456789", "ABCDEFGHI"}, 5);
}
我一直在关注这个 post How to output a string in a marquee fashion? 来输出一个跑马灯。
我的问题是我有一个由多个字符串组成的字符串,由一个字符分隔,在本例中为 '-'
。选取框内的字符串到字符串需要 9 个空格的距离。
我试过这段代码,但结果不是预期的:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
void customSleep( int seconds )
{
#ifdef _WIN32
Sleep( 1000 * seconds );
#else
sleep( seconds );
#endif
}
static char text[] = "STRING01-STRING02";
static char indexOfCharacterToPrint, i, currentStartPosition;
static char temp;
static char blanks;
static char imarquee;
int main() {
while (1) {
if (blanks == 0)
indexOfCharacterToPrint = (currentStartPosition + imarquee) % strlen(text);
temp = text[indexOfCharacterToPrint];
if (temp == '-') {
blanks++;
temp = ' ';
if (blanks == 9)
blanks = 0;
}
printf("%c", temp);
i++;
imarquee++;
if (imarquee == 16)
imarquee = 0;
if (i == 16) {
i = 0;
currentStartPosition++;
customSleep(1);
printf("\r");
}
}
}
预期输出为:
STRING01
TRING01 S
RING01 ST
ING01 STR
NG01 STRI
G01 STRIN
01 STRING
1 STRING0
STRING02
实际输出为
STRING01
TRING02TRING01
TRING02S
ING01 ST
ING02STRNG01
TRING02STRI
01 STRIN
02STRING1
TRING02STRING0
STRING02STRING01
TRING02STRING01
RING02ST
ING01 ST
我错过了什么?
你有东西可以玩。它使用相同大小的字符串。尝试修改它以使用任何大小的字符串(+边界大小写)
#define MAX(a,b) ((a) > (b) ? (a) : (b))
void foo(char *words[], size_t distance)
{
size_t s1len = strlen(words[0]);
size_t s2len = strlen(words[1]);
for(size_t index = 0; index < MAX(s1len, s2len) + 1; index++)
{
for(size_t letter = index; letter < s1len; letter++)
{
if(letter < s1len) printf("%c", words[0][letter]);
else printf(" ");
}
for(size_t space = 0; space < distance; space++)
printf(" ");
for(size_t letter = 0; letter < s2len - (s1len - index); letter++)
{
if(letter < s1len) printf("%c", words[1][letter]);
else printf(" ");
}
printf("\n");
}
}
int main(void)
{
foo((char *[]){"123456789", "ABCDEFGHI"}, 5);
}