我试图通过检查堆栈来理解并实现一种处理可变长度参数函数的方法,但我不知道在哪里以及如何启动.我发现以下链接很有帮助,但我仍然不太明白我是如何能够在c中找到像打印功能这样的东西.
我的问题是从安全角度来看.我正在清理一些代码,我发现当前的代码有一个不受控制的格式字符串漏洞; 它传递一个字符串,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)
我想不出有什么理由会更加安全,但如果我遗漏了一些明显的东西,我也不会感到惊讶.
我的源代码如下:
#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) 我正在编写一个计算两个日期之间经过的天数的程序.为此,我必须在如下定义的结构中输入日期作为整数:
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.谁能帮我解决这个问题?
我在编译此代码时收到此错误字符串未声明.
#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)
有人可以告诉我为什么.非常感谢
我使用宏格式化字符串副本.实例如下.下面给出的代码尝试在字符串的剩余部分填充空字符.
#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中编写一个函数,每个处理器都会打印自己的数据.这是我有的:
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)
它由于某种原因不起作用.阵列全部混合打印.你有什么见解,为什么这不起作用?还有其他有用的想法吗?如果可能的话,我不想在主进程中发送整个数组.另外,我不想使用预编译功能.
我刚刚遇到了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)
这是理想的行为吗?如果是这样,有人可以解释发生了什么吗?
我带来了以下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)
我哪里错了?
我正在尝试使用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]不会写入文件?