当我注意到这段代码时,试图弄清楚函数中的堆栈损坏错误:
fprintf( fp, "\n%s %3c %12s %2c %12s %2c %12s %2c %12s %2c"
"%12s %2c %12s",
xys_field[3], x,
xyzFunc(val1, 0), x,
xyzFunc(val2, 0), x,
xyzFunc(val3, 0), x,
xyzFunc(val4, 0), x,
xyzFunc(val5, 0), x,
xyzFunc(val6,0) );
Run Code Online (Sandbox Code Playgroud)
我问的是关于这一行"\n%s %3c %12s %2c %12s %2c %12s %2c %12s %2c" "%12s %2c %12s",我甚至不明白这是如何编译的,因为我从未见过两种格式如此相互跟随.谢谢你的帮助.
我正在开发一个C项目,现在使用开源方法集成到我的代码中.在浏览代码时,我遇到了一个类似这样的printf语句:
printf("%-9s",someString);
Run Code Online (Sandbox Code Playgroud)
我理解格式说明符%s但是什么是%9s?
我试图寻找解决方案,但没有成功.任何帮助都会有用.
我从静态分析工具中收到有关以下代码段的错误:
uint8_t value = 24U;
char buffer[512];
int chars_printed = snprintf(buffer, sizeof(buffer),
"The value in hex is 0x%02hhX\r\n",
value);
Run Code Online (Sandbox Code Playgroud)
错误是:
MISRA-2004规则10.1违规:隐式转换函数参数中的非常量表达式.将"value"与基础类型"unsigned char"(8位,无符号)转换为类型"int"(32位,有符号).
MISRA期望从"%X"说明符获得的签名和位宽是多少?
据说"%X" unsigned int来自cppreference页面.
IAR编译器的MISRA C 2004检查程序没有错误.
这个来自Coverity.
我当然知道它用于输出带参数的指针.
我读过迈克尔霍华德和大卫勒布朗的书" 编写安全代码".
书中的一个程序演示了堆栈溢出是如何工作的 strcpy()
注意printf()没有参数.
#include <stdio.h>
#include <string.h>
void foo(const char* input)
{
char buf[10];
//What? No extra arguments supplied to printf?
//It's a cheap trick to view the stack 8-)
//We'll see this trick again when we look at format strings.
printf("My stack looks like:\n%p\n%p\n%p\n%p\n%p\n% p\n\n");
//Pass the user input straight to secure code public enemy #1.
strcpy(buf, input);
printf("%s\n", buf);
printf("Now the stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n");
}
void bar(void)
{
printf("Augh! I've been hacked!\n"); …Run Code Online (Sandbox Code Playgroud) 我想了解以下部分:
l (ell)用于指定后续的
d,i,o,u,x,或X转换说明适用于一个long或unsigned long参数; 以下n转换说明符适用于指向long参数的指针; 以下c转换说明符适用于wint_t参数; 以下s转换说明符适用于指向wchar_t参数的指针; 或具有在下文中没有任何影响a,A,e,E,f,F,g,或G转换说明.
我还可以看到这与cppreference一致:fprintf在哪里"%f"和"%lf"等同于printf()家庭.
那么,这个答案错误?或是否C99清楚,现在"%f"是float,虽然"%lf"是double针对printf() …
我想打印n一些数据类型时打印十进制后的位数double.但是,n必须从用户使用获得整数scanf().
double pi = acos(-1);
int n;
printf("\nEnter the number of decimal digits required : ");
scanf("%d",&n);
Run Code Online (Sandbox Code Playgroud)
现在,如何使用printf()打印npi的十进制数字?
在以下程序中,printf()函数根据参数索引规范进行打印。
#include <stdio.h>
int main()
{
printf("%3$d %4$f %2$d %1$d\n", 1, 2, 3, 4.5);
}
Run Code Online (Sandbox Code Playgroud)
输出:
3 4.500000 2 1
Run Code Online (Sandbox Code Playgroud)
所以,我有一个问题,它对任何编译器有效还是仅支持GCC编译器?
我希望这会是我的argv的最后一个字母[1]:
$ cat input_string_fu.c
#include <stdio.h>
int main(int argc, char *argv[])
{
if (argc !=2){
printf("Error: Invalid syntax\n");
return 1;
};
int a;
a = strlen(argv[1]);
if (a >= 2){
printf("Last char of %s : %c\n", argv[1], argv[1][a-1] );
printf("Last char of %s : %s\n", argv[1], argv[1][a-1] );
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么printf("%s")在argv [1] [a-1] segfaulting上.
$ ./a.out stackoverflow
Last char of stackoverflow : w
Segmentation fault
$
Run Code Online (Sandbox Code Playgroud)
感谢您的时间和专业知识!
编辑1:
感谢您的指导.TIL,printf("%s\n", argv[1][a-1]);是segfaulting,因为printf中的%s格式规范要求相应的参数是一个空终止的char数组.
或者,(1)传递一个指针:
printf("%s\n", &argv[1][a-1]);
Run Code Online (Sandbox Code Playgroud)
或者,如: …
我有以下代码:
#include <cstdio>
int main()
{
float b = 323.23f;
std::scanf("%6.3f\n", &b); // <-- Warning
std::printf("%6.3f\n", b);
}
Run Code Online (Sandbox Code Playgroud)
有一个警告scanf()说:
转换说明符无效
'.'
这里有什么我想念的吗?
我当时想解决以下问题,然后以一个我无法在Google上找到答案的问题结束。
问题:是否可以在printf()的另一个格式说明符内使用格式说明符?
问题在于以下代码行中printf()中前导零的大小:
uint16_t num=5;
printf("%02d",num);
Run Code Online (Sandbox Code Playgroud)
是否可以为该“ 2”使用格式说明符?如何根据不同的条件(例如%02d,%03d,%04d等)调整程序中前导零的大小?除了定义不同的类别和不同的printf()行之外,是否可以在此处使用技巧?是否有其他功能而不是printf()来解决此问题?