我想*在我的Linux终端窗口上闪烁(星号),所以我想到使用ANSI控制代码并在循环中首先写入*然后sleep(1)写入" "(空格/空字符串)但它不起作用 - 看不到任何东西.为什么?
这是我的代码:
#include <stdio.h>
#include <unistd.h>
void blink(){
while(1){
printf("\033[2;2H*");
sleep(1);
printf("\033[2;2H ");
}
}
int main(void){
blink();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我理解%#x给出了与0x%x相同的效果,它符合POSIX标准.但人们提到一些编译器不支持它.这是真的,任何一个例子?
我感兴趣(出于各种原因)格式使用sprintf将结果放在一个std::string对象中.我提出的语法最直接的方法是:
char* buf;
sprintf(buf, ...);
std::string s(buf);
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?
有问题的应用程序允许用户在纯文本配置文件中定义自己的消息(主要用于定制和/或本地化目的),这些消息在运行时传递给printf样式的函数.如果用户定义的格式化字符串有问题,可能会发生很多不好的事情.
清理这些用户输入的格式化字符串的最佳方法是什么?或者我应该完全放弃这种方法并使用另一种方法让用户安全地自定义消息?
解决方案必须以某种方式移植(Windows,Linux,BSD,x86,x86-64).
我有一个定义索引类型的代码,以便如果用户知道他们的索引空间保持在正常整数的范围内,他们可以使用int而不是long int.
#ifdef LONG_IDX
typedef long int idx_type
#else
typedef int idx_type
#endif
Run Code Online (Sandbox Code Playgroud)
我的printf代码中有一些语句可以打印出这个索引数据,我不希望将它们包装在#ifdef整个语句中.是否有格式标志来指定参数可以是a long int还是int?如果没有,有没有办法定义一个自定义格式标志,我可以简单地添加到我的索引类型定义?
sprintf只有当你解释为什么不可能/非常不推荐时,我才会接受替代方案
(以下代码)
我想从我的数组插入动态数据到mysql数据库.我也试着试验sprintf,我最近听说过并想开始使用它.
如何从第二个foreach获取数据并通过sprintf将其存储在查询中?
数组:
############################################################
$csv->titles
############################################################
Array
(
[0] => rating
[1] => title
[2] => author
[3] => type
[4] => asin
[5] => tags
[6] => review
)
############################################################
$csv->data
############################################################
Array
(
[0] => Array
(
[rating] => 0
[title] => The Killing Kind
[author] => John Connolly
[type] => Book
[asin] => 0340771224
[tags] =>
[review] => i still haven't had time to read this one...
)
[1] => Array …Run Code Online (Sandbox Code Playgroud) 在一次采访中,我被要求(除其他事项外)实施以下功能:
int StrPrintF(char **psz, const char *szFmt, ...);
Run Code Online (Sandbox Code Playgroud)
类似于sprintf,除了已经分配的存储,函数必须自己分配它,并返回*psz变量.此外,*psz可能指向已经分配的字符串(在堆上),这可能在格式化期间使用.当然,这个字符串必须通过适当的方式释放.
返回值应该是新创建的字符串的长度,或者是错误时的负数.
这是我的实施:
int StrPrintF(char **psz, const char *szFmt, ...)
{
va_list args;
int nLen;
va_start(args, szFmt);
if ((nLen = vsnprintf(NULL, 0, szFmt, args)) >= 0)
{
char *szRes = (char*) malloc(nLen + 1);
if (szRes)
if (vsnprintf(szRes, nLen + 1, szFmt, args) == nLen)
{
free(*psz);
*psz = szRes;
}
else
{
free(szRes);
nLen = -1;
}
else
nLen = -1;
}
va_end(args);
return nLen; …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个简单的小代码片段来响应箭头按键.我知道up由^ [[A表示,我有以下代码检查该序列:
while( 1 )
{
input_char = fgetc( stdin );
if( input_char == EOF || input_char == '\n' )
{
break;
}
/* Escape sequence */
if( input_char == 27 )
{
input_char = getc( stdin );
if( input_char == '[' )
{
switch( getc( stdin ) )
{
case 'A':
printf("Move up\n");
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
每当我点击"向上"时,转义序列(^ [[A]显示在屏幕上,但"上移"直到我按下回车才出现.
最终目标是用其他一些数据替换当前行上的文本,所以我试着这样做
printf("\r%s", "New Text");
Run Code Online (Sandbox Code Playgroud)
取代"向上移动",但在按下输入后仍然不会显示.
我在读字的方式有问题吗?
谢谢!
编辑快速注释,它适用于*nix系统.
解决方案 感谢大家的指点.我选择了stepanbujnak的解决方案,因为它非常简单.我注意到的一件事是修改字符串(退格等)的键的很多行为与你期望的不同.它会在线上退出任何东西(包括printf'd的东西),我不得不考虑到这一点.在那之后,让其他人排成一行并不太糟糕:)
以下代码是否正确?据我所知,它应该无法正常工作,但是在Dev-C ++编译器上,它可以。请有人详细解释吗?
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我写了一个接受输入字符并输出该字符的程序,就像这样
int ch = getchar();
printf("%c", ch);
Run Code Online (Sandbox Code Playgroud)
它像我预期的那样工作.然后我决定先欢迎并打印Hello.
printf("Hello!\n");
int ch = getchar();
printf("%c", ch);
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这导致编译器抛出两个错误:
错误C2065:'ch':未声明的标识符
错误C2143:语法错误:缺少';' 在'类型'之前
我不明白为什么添加第一行会导致这种情况发生.无论如何,我重构了程序以摆脱int声明,错误神奇地消失了.
printf("Hello!\n");
printf("%c", getchar());
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?什么是导致这些错误出现然后消失的魔力?
printf ×10
c ×8
c++ ×2
crt ×1
io ×1
long-integer ×1
newline ×1
performance ×1
php ×1
posix ×1
scanf ×1
stdstring ×1
stream ×1
user-input ×1