我需要将snprintf()移植到另一个不完全支持GLibC的平台上.
我正在寻找Glibc 2.14源代码中的基础声明.我遵循许多函数调用,但卡在vfprintf()上.然后它似乎调用_IO_vfprintf(),但我找不到定义.宏可能会混淆事物.
我需要查看扫描格式字符串的真实C代码,并计算在输入缓冲区足够大时它将写入的字节数.
我也尝试过查看newlib 1.19.0,但我遇到了_svfprintf_r().我无法在任何地方找到定义.
有人能指出我为snprintf()定义或另一个定义吗?
背景:我目前正在尝试通过支持处理某些结构来“扩展”标准C格式,类似于Objective-C如何扩展C格式以允许对带有“%@”序列的NSString的支持。
我苦苦挣扎的一个问题是vsprintf在OS X和Linux上的行为似乎有所不同(我已经在Ubuntu 10.10和12.04上进行了测试)。在OS X上,它表现的是我的预期,在调用vsprintf之后,调用va_arg返回ms指针(就像vsprintf函数调用va_arg来获得5一样)。但是,在Linux上,va_list不会从vsprintf更改,并且调用va_arg返回5。
我真的很想找出一种实现此功能的方法,以使其在各个平台之间始终如一地运行。假设您可以期望vsprintf持续更改va_list中的指针是错误的,以便下次调用va_arg时,它返回下一个尚未使用的参数?
我已尽可能简化了代码以演示该问题。在OS X上,此代码输出从malloc返回的指针的正确地址。在Linux上,foo中的ms的值变为5,因此它将输出5。
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
static void foo(void *, ...);
typedef struct {
char *value;
} mystruct;
int main(int argc, char *argv[]) {
mystruct *ms = malloc(sizeof(mystruct));
foo(NULL, "%d %@", 5, ms);
}
void foo(void *dummy, ...) {
va_list args;
va_start(args, dummy);
char buffer[512];
int buffer_ptr = 0;
int i = 0;
char *format = va_arg(args, char *);
buffer[0] = '\0';
for (i = 0; i < strlen(format); i++) …Run Code Online (Sandbox Code Playgroud) 任何人都可以告诉我为什么不包括stdio.h仍然使用该printf功能只在gcc上发出警告?
警告:内置函数'printf'的不兼容隐式声明
相反,这应该是一个编译错误,因为我们包括一个未声明的函数.
这与链接程序有关吗?请详细说明.
在awk有两个输出功能:print和printf.
awk完全不同?time命令行上的" ")?我正在尝试打印整个单词,而不仅仅是第一个字母.我可以通过循环来做到这一点,但我认为有更好的方法.我正在四处搜索并看到他们将%S更改为%c的答案,但我已经在使用%c,因为它是一个字符数组.
char* words[] = {"my", "word", "list"};
printf("The word: %c",*words[2]);
Results:
The word: l
Run Code Online (Sandbox Code Playgroud) 我试图制作一个程序,将10个数字作为输入,并使用C中的指针以相反的顺序输出它们.
#include<stdio.h>
#define N 10
int array[N]; //Global variable
int main(void) {
int j;
int i;
printf("Enter 10 numbers: ");
for (i=0;i<N;i++) {
scanf("%d",(array+(4*i))); //Works
}
for (j=N-1;j<0;j--) {
printf("%d",array[j]); //Doesn't print, using *(array+j*4) doesn't
//print also
}
printf("\n");
printf("%d\n",*(array)); //Works so scanf works
printf("%d\n",*(array+4)); //Works so scanf works
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试为两个for循环创建一个单独的函数,但它仍然不起作用.我想知道为什么这个for循环不打印但是它下面的两个printfs打印出来.
编辑:
我的新代码是
#include<stdio.h>
#define N 10
int array[N]; //Global variable
int main(void) {
int j;
int i;
printf("Enter 10 numbers: ");
for (i=0;i<N;i++) {
scanf("%d",(array+i)); //Works
} …Run Code Online (Sandbox Code Playgroud) 请解释输出.是什么%.#s在printf()意思?
#include<stdio.h>
#include <stdlib.h>
int main(int argc,char*argv[]){
char *A="HELLO";
printf("%.#s %.2s\n",A,A);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
#s HE
Run Code Online (Sandbox Code Playgroud) 我写了一个自定义打印功能.我的问题是我需要返回一个,const char*因为这必须在另一个函数中使用.我根本不知道如何管理......
anotherFunction (const char* text /*Here*/, unsigned __int32 value, unsigned __int64 bigVal);
我知道以下示例/ s不能正常工作.这就是我到目前为止所尝试过的.
const char* CatchMessage (const char *message, ...)
{
va_list args;
va_start (args, message);
/*?*/
va_end (args);
return message;
}
Run Code Online (Sandbox Code Playgroud)
我只是设法在cmd中获得正确的输出,但实际上我需要它作为返回值.
void CatchMessage (const char *message, ...)
{
va_list args;
va_start (args, message);
vfprintf (stdout, message, args);
va_end (args);
}
Run Code Online (Sandbox Code Playgroud)
呼叫:
CatchMessage ("Some Input %s and %d equals to %d", randString, randNumber, secRandNumber);
Run Code Online (Sandbox Code Playgroud)
应该返回:
"Some Input stuff and 12 equals to 6" …Run Code Online (Sandbox Code Playgroud) 我有一个打电话的程序fprintf.在Visual Studio 2013中,编译和执行的所有内容都没有错误和警告.现在该项目已迁移到Visual Studio 2015(没有任何更改),我的大多数fprintf调用都收到以下警告:
C4474: too many arguments passed for format string
Run Code Online (Sandbox Code Playgroud)
大多数这些警告都指向以下代码行:
fprintf (stderr,"Missing header file name. Formant is :\n", pArg);
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?我是否需要重写我的代码,或者导致这些警告的项目设置是否有问题?
我看到,在这篇 MSDN文章中,对这些函数进行了更改:
所有printf和scanf函数的定义都已内联移入stdio.h,conio.h和其他CRT头文件中.
这与我的问题有关吗?这对VS 2015来说只是一个无害的变化,还是存在一个潜在的崩溃导致的陷阱?
谁能向我解释为什么它打印 32 以及它如何工作的总体概念?
#include <stdio.h>
int main()
{
int a=1;
for (printf ("3"); printf ("2"); printf ("1"))
return 0;
}
Run Code Online (Sandbox Code Playgroud)