这可能很简单,但我似乎无法让它工作.
我有这个非常简单的代码片段:
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[100];
char *p = buf;
strcpy(p, "Test string");
printf("%s\n", *p);
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时会导致分段错误.GDB输出:
Program received signal SIGSEGV, Segmentation fault.
0xb76af3b3 in strlen () from /lib/i686/cmov/libc.so.6
Run Code Online (Sandbox Code Playgroud)
但我仍然没有得到它.
评论将不胜感激,谢谢.
我知道sprintf但我怎么能在任何地方使用相同的param?例
sprintf("blabla %s 11111 %s", "test");
Run Code Online (Sandbox Code Playgroud)
- 比如说几个参数,但我想把'测试'放在两个地方,没有重复
我需要在我的代码中打印多个数组的内容.例如
function performOp($n, $inputArr, $workArr)
{
printf("Entered function, value of n is %d", $n);
print_r($inputArr);
print_r($workArr);
$width =0;
}
现在,有没有什么方法可以编写单个语句并打印两个数组,而不是写两次print_r?另外,如果我想在显示数组{}之前打印"输入数组值是",有没有办法使用printf或任何其他功能?
我试着写作
printf("Value of inputArray is %s ", print_r($inputArr),但这不起作用.
任何帮助都非常感谢.
谢谢
我在C99写了一个Multiprecision Library.根据我的代码编译的平台,我选择不同的表示基础.
所以,例如,假设在平台X上系统选择BASE = 100; 在平台上Y BASE = 10000;
假设我代表大的unsigned int如下:
typedef struct a {
big_enough_uint *digits;
unsigned int length;
unsigned int last;
} bigUint;
Run Code Online (Sandbox Code Playgroud)
所以,当我在BASE-100系统上时,我想要我的打印功能
void my_print(bigUint *A){
unsigned int i=0;
fprintf(stdout,"%d",A->digits[0]);
if(i!= A->last){
for(;i<=A->last;i++)
fprintf(stdout,"%02d",A->digits[i]);
}
printf(stdout,"\n");
}
Run Code Online (Sandbox Code Playgroud)
在BASE-10000系统上,我希望它是类似的
void my_print(bigUint *A){
unsigned int i=0;
fprintf(stdout,"%d",A->digits[0]);
if(i!= A->last){
for(;i<=A->last;i++)
fprintf(stdout,"%04d",A->digits[i]);
}
printf(stdout,"\n");
}
Run Code Online (Sandbox Code Playgroud)
我为什么要这样做?
假设我有以下数字:
12345600026789
Run Code Online (Sandbox Code Playgroud)
在BASE-100表示中,数字数组将是(小端形式):
12|34|56|0|2|67|89
^ ^ I want ONE LEADING ZEROES
Run Code Online (Sandbox Code Playgroud)
在BASE-10000中:
12|3456|2|6789
^ I want THREE LEADING ZEROES
Run Code Online (Sandbox Code Playgroud)
有一个简单的方法吗?
GCC和Clang都支持对变量参数函数进行编译时检查printf.这些编译器接受如下语法:
extern void dprintf(int dlevel, const char *format, ...)
__attribute__((format(printf, 2, 3))); /* 2=format 3=params */
Run Code Online (Sandbox Code Playgroud)
在OSX上,Cocoa框架也使用它的扩展NSString:
#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A)))
Run Code Online (Sandbox Code Playgroud)
在我们公司,我们有一个自定义C++框架,其中包含一大堆类,如BaseString所有类BaseObject.在BaseString有几个可变参数的方法类似sprintf,但也有一些扩展.例如,"%S"期望一个类型的参数BaseString*,并"%@"期望一个BaseObject*参数.
我想对我们项目中的参数执行编译时检查,但由于扩展,会__attribute__((format(printf)))给出大量误报警告.
有没有办法定制__attribute__((format))两个编译器之一的支持?如果这需要编译器源的补丁,它是否可以在合理的时间内完成?或者,是否还有其他类似工具的lint可以执行检查?
在我的代码(严格的C,而不是C++)中,我用这种方式使用vsnprintf:
char* buf = NULL;
size_t sz;
sz = vsnprintf( buf, 0, format, args); // Ask vsnprintf how big a buffer we need
buf = (char*) malloc(sz + 1);
vsnprintf( buf, sz, format, args); // Now actually fill the buffer
/* Use buf in a dialog box... then: */
free(buf);
Run Code Online (Sandbox Code Playgroud)
但MS Visual C++(MSVS10)编译器警告:
warning C4996: 'vsnprintf': This function or variable may be unsafe. Consider using vsnprintf_s instead.
Run Code Online (Sandbox Code Playgroud)
但是,vsnprintf_s也不能有漂亮的功能,当您为缓冲区传递NULL它将描述多少数据它会打印.相反,它被记录为返回-1.
我觉得我vsnprintf通过确定必要的尺寸以安全的方式使用,并且建议的更换,vsnprintf_s …
在下面的页面中,我发现了代码
CERT INT15-C对程序员定义的整数类型使用intmax_t或uintmax_t作为格式化IO
uintmax_t temp;
if(scanf("%ju", &temp) != 1) {
...
Run Code Online (Sandbox Code Playgroud)
我不熟悉"%ju"说明符.我没有成功找到互联网上"%ju"的解释.
这是由某些特定的编译环境定义的,还是一般使用的?
我在unix脚本中有以下行:
head -1 $line | cut -c22-29 >> $file
Run Code Online (Sandbox Code Playgroud)
我想在没有换行符的情况下附加此输出,而是用逗号分隔.有没有办法将此命令的输出提供给printf?我试过了:
head -1 $line | cut -c22-29 | printf "%s, " >> $file
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
printf "%s, " head -1 $line | cut -c22-29 >> $file
Run Code Online (Sandbox Code Playgroud)
这些都没有奏效.有人有主意吗?
我有以下结构:
/** The description of an ordinary 8+3 DOS directory entry. */
struct dirent
{
byte d_name[8]; //!< space padded name
byte d_ext[3]; //!< space padded extension
byte d_attr; //!< the file attributes
......
};
printf("%s\n", de.d_name);
Run Code Online (Sandbox Code Playgroud)
我面临的问题是打印d_name我得到以下输出: 'INSTALL BAT!' 这不是我最想要的8个字符.
我的猜测是printf函数继续在内存中搜索字符串终止符,即使它超出了d_name边界.
有没有办法只打印'INSTALL'或者我是否需要遍历整个字节数组并单独打印字符?
在脚本中,我经常调用该函数Rcplex(),该函数将"CPLEX环境打开"和"已关闭的CPLEX环境"打印到控制台.由于该函数被频繁调用,因此它经常打印,这非常烦人.有没有办法压制这个?我试过sink(),suppressWarnings/Messages或invisible(catch.output())但这些都不奏效了.我继续检查代码Rcplex()并找到打印到控制台的位置.Rcplex()调用底层的C函数(Rcplex.c).在rcplex.c的代码中,我找到了导致打印的命令:
REprintf("CPLEX environment opened\n");
REprintf("Closed CPLEX environment\n");
Run Code Online (Sandbox Code Playgroud)
有没有办法捕获输出,REprintf()以便它不会打印到R控制台?一种方法显然是弄乱Rcplex.c文件并删除相应的行.但是,这不是一个非常干净的解决方案,这就是为什么我要求另一种方法来捕获C函数的输出.