我正在尝试按以下方式打印字符串:
int main(){
string s("bla");
printf("%s \n", s);
.......
}
Run Code Online (Sandbox Code Playgroud)
但我得到的只是随机的胡言乱语.
你能解释一下原因吗?
我正在努力学习为64位Mac OS编写汇编语言.我对32位Mac OS以及32位和64位Linux没有任何问题.
但是,Mac OS 64位是不同的,我无法弄清楚.因此,我在这里寻求帮助.
我没有使用系统调用打印的问题.但是,我想学习如何使用Mac OS的64位汇编语言调用C函数.
请查看以下代码
.data
_hello:
.asciz "Hello, world\n"
.text
.globl _main
_main:
movq $0, %rax
movq _hello(%rip), %rdi
call _printf
Run Code Online (Sandbox Code Playgroud)
我使用$ gcc -arch x86_64 hello.s
组装和链接.
它生成二进制代码.但是,运行它时出现了分段错误.
我在调用_printf之前尝试添加"subq $ 8,%rsp",仍然和以前一样.
我做错了什么?
顺便说一下,这是在Mac上调试此代码的任何方法吗?我尝试添加-ggdb或-gstab或-gDWARF和$ gdb ./a.out,但无法查看代码并设置断点.
好吧,我遇到了一个奇怪的问题,在Windows 7上使用MinGW(GCC 4.6.2)编译C文件.该文件包含以下C代码:
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("%2hhX\n", 250);
char c[80];
snprintf(c, sizeof(c), "%2hhX", 250);
printf("%s\n", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译结果如下:
$ gcc.exe -std=c99 -pedantic -Wall test.c
test.c: In function 'main':
test.c:6:2: warning: unknown conversion type character 'h' in format [-Wformat]
test.c:6:2: warning: too many arguments for format [-Wformat-extra-args]
Run Code Online (Sandbox Code Playgroud)
现在,对我来说很奇怪的是,它抱怨snprintf第6行的电话,而不是第printf4行的电话.我错过了什么或警告是不正确的?另外,格式字符串可能有更好的等价物"%2hhX"吗?(我正在尝试将char变量打印为十六进制值.)
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
int main(int argc, char* argv[])
{
std::clock_t start;
double duration;
std::cout << "Starting std::cout test." << std::endl;
start = std::clock();
for (int i = 0; i < 1000; i++)
{
std::cout << "Hello, World! (" << i << ")" << std::endl;
}
duration = (std::clock() - start) / (double) CLOCKS_PER_SEC;
std::cout << "Ending std::cout test." << std::endl;
std::cout << "Time taken: " << duration << std::endl;
std::system("pause");
std::cout << "Starting std::printf test." …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用打印一些浮点数printf.例如:
int main()
{
printf("%.1f",76.75);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:76.8
我对结果有一些疑问.
首先,为什么不打印76.7?
第二,它是如何围绕这个数字的呢?
我有一个简单的函数,可以将一些数据写入新文件.它工作正常,文件已写入,但在MSVS Express 2013中调试时出现上述错误.
void writeSpecToFile(const char *fname); //in header file.
char myChar [20];
sprintf(myChar, "aa%03daa%daa", i1, i2);
const char* new_char = myChar;
writeSpecToFile(myChar);
Run Code Online (Sandbox Code Playgroud)
如图所示,我只是使用sprintf将一些变量插入到字符串中(工作正常).现在,无论我是通过myChar还是new_char,它仍然会给我带来损坏错误.
什么地方出了错?
使用%sc语言可以打印的最大尺寸是多少.
我试图在文件中打印一个缓冲区,fprintf但在某一点上,我觉得它更多的是320KB.并将fprintf截断的字符串写入文件.有没有限制%s?
我想知道在C#中使用什么来在我的控制台窗口中格式化我的输出我试图使用\ t但它不起作用
我知道C中有printf来格式化我的输出
寻找澄清使用"zd"与printf().
当然,以下对于C99及更高版本是正确的.
void print_size(size_t sz) {
printf("%zu\n", sz);
}
Run Code Online (Sandbox Code Playgroud)
C规范似乎允许printf("%zd\n", sz)取决于它的读取方式:
7.21.6.1 fprintf功能
z用于指定后续的d,i,o,u,x,或X转换说明适用于size_t或相应的符号整型参数; 或者以下n转换说明符适用于指向与size_t参数对应的有符号整数类型的指针.C11dr§7.21.6.17
这应该是作为
z指定以下d...转换说明符适用于size_t或相应的有符号整数类型参数..."(两种类型)和" z指定以下u...转换说明符适用于size_t或相应的有符号整数类型参数. .."(两种类型)要么
z指定以下d...转换说明符适用于相应的有符号整数类型参数..."(仅限带符号类型)和" z指定以下u...转换说明符适用于size_t"(仅限无符号类型).我一直在使用#2定义,但现在不太确定.
哪个是正确的,1,2或其他什么?
如果#2是正确的,那么可以使用
"%zd"哪种类型的示例是什么?
根据微软的文档vsnprintf,该功能至少是2003年版Visual Studio中C(++)运行时库的一部分.
int vsnprintf( char *buffer, // Storage location for output
size_t count, // Maximum number of characters to write
const char *format, // Format specification
va_list argptr ) // Pointer to list of other arguments
Run Code Online (Sandbox Code Playgroud)
我问:Visual Studio的哪个版本是vsnprintfx86和x64的捆绑C(++)RTL的实现,符合C99标准(ISO/IEC 9899:1999),假设
#define _CRT_SECURE_NO_WARNINGS以前执行#include <stdio.h>,这是现代版本的Visual Studio RTL所必需的;count大于零,则buffer指向(至少)count可写字符;NULL符合Microsoft的格式规范语法,适用于特定版本的RTL;count和字符,以产生均足够小以适合类型的数目int;并且我们希望符合(包括标称输入的基本功能)这些要求(由标准的规范暗示snprintf,vsnprintf引用):
buffer==NULL和时返回要写入的长度(不包括终止空字符) …