在C是不正常可以使用'的printf字符串.但是,我的文字充满双引号",我需要将它们全部转义为
printf("This is \"test\" for another \"text\"");
Run Code Online (Sandbox Code Playgroud)
是否有可能printf在没有逃脱的情况下".我的意思是使用另一个字符来包装字符串.
我正在使用matlab分析大型数据集.我希望能够在这个矩阵上运行fprintf命令行,它有大约22000列.所以,到目前为止我的想法是:
j=22;
for i = 1:j;
fname = fopen(strcat('chr', num2str(i), '.out'), 'r');
A = fscanf(fname, '%d', [1000,inf]);
FIDW = fopen(strcat('chrproc', num2str(i), '.out'), 'w+');
fprintf(FIDW, '%d\t%d\t%d\t%d\t%d\t%d\t\n', B);
end
Run Code Online (Sandbox Code Playgroud)
这个大小的22个文件将通过1-4行转换为矩阵.然而,棘手的部分(至少对我来说)是fprintf要求您提供FORMAT.因为这些文件太大,所以没有真正的方法输入%d\t.
也许fgetl命令更好?但fgetl不打印到文件,更重要的是,fgetl返回一个字符串,这对我来说效果不好.真的,像fscanf命令之类的东西会很棒,除了读取而不是打印...
非常感谢您的帮助和建议.
printf()今天我遇到了一个奇怪的问题.但即使经过分析,我也找不到它的答案.因此在这里分享.我尝试了这三个printf()陈述:
printf("\nValue of this division is %f", (double)873/(double)65);
Run Code Online (Sandbox Code Playgroud)
它按预期打印正确的输出.
printf("\nSome message with an integer here %d followed by floats %f, %f, %f", 2013, 987/432, 873/65, 983/81);
Run Code Online (Sandbox Code Playgroud)
给我错误的值(因为我没有把它们加倍?)
printf("\nSome message with an integer here %d followed by floats %f, %f, %f and now string at end: %s", 2013, 987/432, 873/65, 983/81, "Some trial string here");
Run Code Online (Sandbox Code Playgroud)
printf()在这里坠毁了!这引起了两个问题:
我在MSDN中看到了"FormatOutput(LPCSTR formatstring,...)"示例,其中它们分配了固定宽度的目标缓冲区,然后vsnprintf()使用它进行调用.我相信printf()在同一条线上工作.但我没有找到任何内部缓冲区大小printf().如果它动态分配内存,那么它如何计算缓冲区大小?
printf()在上面崩溃,因为vsnprintf()那里也崩溃了(是的,我尝试了上面参数FormatOutput给出的示例代码vsnprintf()).但为什么最终会崩溃呢?
最近,我正在使用在MIPS架构上运行的特殊嵌入式操作系统.我不太了解它.当我使用printf函数时,看到一些奇怪的东西:
int a = 10;
float b = 3.14;
double c = 3.14;
printf("a is %d\n", a); // I'm sorry I forgot to type the parameters just now
printf("b is %f\n", b); // Error
printf("c is %f\n", c); // Error
Run Code Online (Sandbox Code Playgroud)
输出是:
a is 10
b is 0.000000
Run Code Online (Sandbox Code Playgroud)
a是对的,但b似乎是错的,c甚至无法打印.函数printf来自newlib(一个C语言库).注意,可以正确计算浮点数/双数,正确存储在内存中,并且它们无法正确打印.
我认为操作系统可能有问题.我只是想知道可能是什么原因.有没有人以前遇到过这个问题?
一切正常:
#include <stdio.h>
int (* func)(const char * fmt, ...);
int main()
{
func = (void *)0x400420; /* printf pointer */
printf("printf address: %p\n", printf);
func("func() calling\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
#include <stdio.h>
int (* func)(const char * fmt, ...);
int main()
{
func = (void *)0x400420; /* printf pointer */
/* printf("printf address: %p\n", printf); */
func("func() calling\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我做错了什么?请告诉我.我可以用它的指针调用printf(或其他一些函数)吗?
我需要将输出printf("%02X", buffer[0])放入字符串中.
理论上它将是这样的:
string str = printf("%02X", buffer[0]) +printf("%02X", buffer[1]) +printf("%02X", buffer[2]) +printf("%02X", buffer[3]);
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用,我无法弄清楚如何做到这一点.
任何帮助表示赞赏,谢谢.
我在使用这一小段代码时遇到了一些问题:
int main(int argc, char **argv){
struct ether_addr *s, *d;
u_char dir1[] = {0x00,0x11,0x22,0x33,0x44,0x55};
u_char dir2[] = {0x66,0x77,0x88,0x99,0xaa,0xbb};
s = dir1;
d = dir2;
printf("Together: %s\t%s\n",ether_ntoa(s),ether_ntoa(d));
printf("Apart: %s\t",ether_ntoa(s));
printf("%s",ether_ntoa(d));}
Run Code Online (Sandbox Code Playgroud)
输出应该是相同的,但事实上,它是:
Together: 66:77:88:99:aa:bb 66:77:88:99:aa:bb
Apart: 0:11:22:33:44:55 66:77:88:99:aa:bb
Run Code Online (Sandbox Code Playgroud)
如果我将两个目录放在同一行,它只打印其中一个.为什么会这样?
为了在C中练习我的编程技巧,我试图自己编写strncpy函数.这样做我总是遇到错误,解决了大部分错误,最终我没有进一步的灵感继续下去.
我收到的错误是:
ex2-1.c:29:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
printf("The copied string is: %s.\n", stringb);
Run Code Online (Sandbox Code Playgroud)
问题是,这是一个非常常见的错误,并且它也已经在SO上描述,但我似乎无法应用其他人已经指出的提示.我知道在打印变量时我使用了错误的类型,当我使用%d格式时,它将返回一个整数,这可能是第一个字符的ASCII值,因为它在增加最大数字时不会改变要复制的字节数.
使用GDB我发现迭代通过while循环的b变量保持正确的字符串,但我似乎无法打印它.
我可能缺乏关于C语言的非常基本的知识部分而且我为这个新手问题(再一次)提出了道歉.如果您能提供反馈或指出我的代码中的其他缺陷,我将不胜感激.
#include <stdlib.h>
#include <stdio.h>
void strmycpy(char **a, char *b, int maxbytes) {
int i = 0;
char x = 0;
while(i!=maxbytes) {
x = a[0][i];
b[i] = x;
i++;
}
b[i] = 0;
}
int main (int argc, char **argv) {
int maxbytes = atoi(argv[2]);
//char stringa;
char stringb;
if (argc!=3 || …Run Code Online (Sandbox Code Playgroud) 我有这一大块代码
static void err_doit(int errnoflag, int level, const char *fmt, va_list ap)
{
int errno_save;
unsigned long n;
char buf[MAXLINE];
errno_save = errno;
#ifdef HAVE_VSNPRINTF
vsnprintf(buf, sizeof(buf), fmt, ap); /* this is safe */
#else
vsprintf(buf ,fmt, ap); /* this is not safe */
#endif
n = strlen(buf);
if (errnoflag)
snprintf(buf + n, sizeof(buf) - n, ": %s", strerror(errno_save));
strcat(buf, "\n");
if (daemon_proc) {
syslog(level,"%s", buf);
} else {
fflush(stdout);
fputs(buf, stderr);
fflush(stderr);
}
return;
}
Run Code Online (Sandbox Code Playgroud)
当我编译它(Clang 5.0.0 with -Weverything)时,我获得了这些警告: …
在我的代码中,我使用了fprintf.我使用flawfinder检查代码是否存在漏洞,我得到了:
358:[4](格式)
fprintf:如果格式字符串可能受到攻击者的影响,则可以利用它们.使用常量作为格式规范.
有人可以向我解释一下格式规范使用常量实际意味着什么吗?有安全版fprintf吗?