标签: printf

不使用stdarg.h的可变长度参数

我试图通过检查堆栈来理解并实现一种处理可变长度参数函数的方法,但我不知道在哪里以及如何启动.我发现以下链接很有帮助,但我仍然不太明白我是如何能够在c中找到像打印功能这样的东西.

http://www.swig.org/Doc1.3/Varargs.html

C++中函数参数列表中的尾随点(...)

c printf

3
推荐指数
1
解决办法
2477
查看次数

为printf调用添加长度说明符更安全吗?

我的问题是从安全角度来看.我正在清理一些代码,我发现当前的代码有一个不受控制的格式字符串漏洞; 它传递一个字符串,printf()如:

void print_it(char * str)
{
    printf(str);
Run Code Online (Sandbox Code Playgroud)

这显然被认为是不安全的编程,即使gcc通常会至少给你一些警告:

警告:格式不是字符串文字,也不是格式参数

现在要"修复"这个问题,我们可以确保你得到的东西被视为一个字符串

printf("%s", str);
Run Code Online (Sandbox Code Playgroud)

但是我想知道在使用长度特定器时是否有任何额外的安全性.就像是:

printf("%.*s", (int)sizeof(str), str);
Run Code Online (Sandbox Code Playgroud)

我想不出有什么理由会更加安全,但如果我遗漏了一些明显的东西,我也不会感到惊讶.

c security printf format-string

3
推荐指数
1
解决办法
609
查看次数

为什么我的C程序产生奇怪的printf输出?

我的源代码如下:

#include <stdio.h>
int main()
{
    float latitude;
    float longitude;
    char info[80];
    int started = 0;
    puts("data=[");
    while (scanf("%f, %f, %79[^\n]", &latitude, &longitude, info) == 3) {
        if (started)
            printf(",\n");
        else
            started = 1;
        printf("{latitude: %f, longitude: %f, info: '%s'}", latitude, longitude, info);

    }
    puts("\n]");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我有一个数据文件gpsdata.csv如下:

42.363400,-71.098465,Speed = 21
42.363327,-71.097588,Speed = 23
42.363255,-71.096710,Speed = 17
Run Code Online (Sandbox Code Playgroud)

我明白了

./geo2json < gpsdata.csv
data=[
'},titude: 42.363400, longitude: -71.098465, info: 'Speed = 21
'},titude: 42.363327, longitude: -71.097588, info: 'Speed = 23
{latitude: …
Run Code Online (Sandbox Code Playgroud)

c printf scanf

3
推荐指数
1
解决办法
237
查看次数

使用带有%i的scanf捕获日期时的问题(mm dd yyyy)

我正在编写一个计算两个日期之间经过的天数的程序.为此,我必须在如下定义的结构中输入日期作为整数:

struct date {
    int month;
    int day;
    int year;
};
Run Code Online (Sandbox Code Playgroud)

现在,我已经想出了如何运行我的程序,但是当月或日是单个数字时,用户无法以(mm dd yyyy)格式输入日期,这真是让我烦恼.让我告诉你我的代码(请不要介意调试printf语句):

printf("Enter your start date (mm dd yyyy)\n");
scanf("%i %i %i", &startDate.month, &startDate.day, &startDate.year);
// DEBUG printf("Start date = %i/%i/%i\n", startDate.month, startDate.day, startDate.year);
// DEBUG printf("start date month = %i", startDate.month);

printf("Enter your end date (mm dd yyyy)\n");
scanf("%i %i %i", &endDate.month, &endDate.day, &endDate.year);
// DEBUG printf("End date = %i/%i/%i\n", endDate.month, endDate.day, endDate.year);
Run Code Online (Sandbox Code Playgroud)

如果用户输入:

08 08 2004
Run Code Online (Sandbox Code Playgroud)

然后将开始日期记录为

0/8/0
Run Code Online (Sandbox Code Playgroud)

这等于用户输入的前三位数字.好的,我明白了.我也明白用户可以输入"8 8 2004"并且程序运行良好......但我相信编程是关于细节的,而且这个是一个bugger.谁能帮我解决这个问题?

c printf date scanf

3
推荐指数
1
解决办法
3342
查看次数

编译代码时出错

我在编译此代码时收到此错误字符串未声明.

#include <stdio.h>
#include <stdlib.h>


int main()
{
string names;
printf("What is your name?\n");
scanf("%s", &names);

printf("Your name is %s", names);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么.非常感谢

c++ printf declaration

3
推荐指数
1
解决办法
70
查看次数

在sprintf中的字符串内的C宏

我使用宏格式化字符串副本.实例如下.下面给出的代码尝试在字符串的剩余部分填充空字符.

#include <stdio.h>

#define LEN     10
#define str(x)  #x

void main() {
    char a[LEN];
    int b = 3445;

    sprintf(a, "%-"str(LEN)"d", b);     // I want "%-10d" here
    printf("|%s|", a);
}
Run Code Online (Sandbox Code Playgroud)

当我用gcc -Wall prog.c它编译它时会发出以下警告.

warning: format ‘%LE’ expects argument of type ‘long double’, but argument 3 has type ‘int’ [-Wformat]
Run Code Online (Sandbox Code Playgroud)

这意味着宏未被正确替换.任何人都可以在这里帮助我这里有什么问题.

c macros printf padding

3
推荐指数
1
解决办法
1351
查看次数

MPI - 按订单打印

我正在尝试在C中编写一个函数,每个处理器都会打印自己的数据.这是我有的:

void print_mesh(int p,int myid,int** U0,int X,int Y){
    int i,m,n;
    for(i=0;i<p;i++){
        if(myid==i){
            printf("myid=%d\n",myid);
            for(n=0;n<X;n++){
                for(m=0;m<Y;m++){
                    printf("%d ",U0[n][m]);
                }
                printf("\n");
            }
        }
        else MPI_Barrier(MPI_COMM_WORLD);
    }
}
Run Code Online (Sandbox Code Playgroud)

它由于某种原因不起作用.阵列全部混合打印.你有什么见解,为什么这不起作用?还有其他有用的想法吗?如果可能的话,我不想在主进程中发送整个数组.另外,我不想使用预编译功能.

c parallel-processing printf mpi

3
推荐指数
1
解决办法
5996
查看次数

意外的格式字符串行为

我刚刚遇到了python中奇怪的字符串格式化行为.原来是由回车字符('\ r')引起的,我不知道有没有.这是一个例子:

>>> text = 'hello\r'
>>> '(SUBJECT "%s")' % (text)
'(SUBJECT "hello\r")'
>>> print '(SUBJECT "%s")' % (text)
")UBJECT "hello
Run Code Online (Sandbox Code Playgroud)

我在C(在几台机器上)尝试了同样的事情作为一个完整性检查.

#include <stdio.h>

int main()
{
    char *text = "hello\r";
    printf("(SUBJECT \"%s\")\n", text);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

% ./a.out
")UBJECT "hello
Run Code Online (Sandbox Code Playgroud)

这是理想的行为吗?如果是这样,有人可以解释发生了什么吗?

c python printf string-formatting

3
推荐指数
1
解决办法
146
查看次数

为什么我无法将sprintf的变量字符串传递给perl脚本?

我带来了以下perl问题.把这段代码放到test.pl中

my $str=shift;

printf "$str", @ARGV;
Run Code Online (Sandbox Code Playgroud)

然后像这样运行:

perl test.pl "x\tx%s\n%s" one two three
Run Code Online (Sandbox Code Playgroud)

我的预期输出应该是:

x    xone
two
Run Code Online (Sandbox Code Playgroud)

相反,我得到了

x\sxone\ntwo
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

perl printf

3
推荐指数
1
解决办法
124
查看次数

在R中删除带有接收器和sprintf输出的[1]

我正在尝试使用sprintf和sink编写一系列字符和数值:

 sink("sample.txt", append=TRUE, split=TRUE)
 sprintf("Hello World")
Run Code Online (Sandbox Code Playgroud)

当然,上面是一个例子,所以我没有上面数据框的数值,但我需要使用sprintf.

文本文件(sample.txt)中的输出如下所示:

 [1] Hello World
Run Code Online (Sandbox Code Playgroud)

如何从线上删除[1]?有没有办法使[1]不会写入文件?

printf r sink

3
推荐指数
1
解决办法
1386
查看次数