printf("%d",printf("%*s%*s",6,"",6))
结果添加了2个数字(6 + 6),是否有人使用这种类型的格式说明符
我想以十六进制格式打印字符串,
在机器A上,类似于
ori_mesg = gen_rdm_bytestream (1400,seed)
sendto(machine B, ori_mesg, len(mesg))
Run Code Online (Sandbox Code Playgroud)
在机器B上
recvfrom(machine A, mesg)
mesg_check = gen_rdm_bytestream (1400, seed)
for(i=0;i<20;i++){
printf("%02x ", *(mesg+i)& 0xFF);
}
printf("\n");
for(i=0;i<20;i++){
printf("%02x ", *(mesg_check+i));
}
printf("\n");
Run Code Online (Sandbox Code Playgroud)
seed 在1,2,3之间变化....
字节生成函数是:
u_char *gen_rdm_bytestream (size_t num_bytes, unsigned int seed)
{
u_char *stream = malloc (num_bytes+4);
size_t i;
u_int16_t seq = seed;
seq = htons(seq);
u_int16_t tail = num_bytes;
tail = htons(tail);
memcpy(stream, &seq, sizeof(seq));
srand(seed);
for (i = 3; i < num_bytes+2; i++){
stream[i] = rand (); …Run Code Online (Sandbox Code Playgroud) 我正在编写一个基本程序,以学习如何在C语言中使用基本输入/输出,并且效果很好。我唯一的问题是打印时,终端上字符串的末尾有一个“%”。这是我的代码:
#include <stdio.h>
int main(int argc, char **argv) {
char name[32];
printf("Enter your name: ");
scanf("%s", name);
printf("Hello, %s", name);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,输出为 Hello, Andrew%
有什么帮助吗?
我使用两个函数sprintf和snprintf来处理"double"到string的转换.在其中一个案例中,正在运行的应用程序具有与Windows的语言环境不同的语言环境.因此,在这种情况下,sprintf考虑的语言环境始终是应用程序.然而,snprintf有时会开始使用Windows语言环境.因此,两种方法返回的十进制字符都不同,从而导致问题.
为了提供更多细节,我在我的项目中有一个库,它从"double"构建一个字符串,这个库使用snprintf将double转换为字符串.然后我需要将此信息发送到服务器,该服务器将理解"." (点)仅作为小数符号.因此,我需要用"."替换本地十进制字符.(点).要找出本地十进制字符(为了替换它),我使用的是我的项目中提供的一个使用sprintf的库.然后我用一个点替换这个字符以获得最终输出.
另外,请注意,sprintf始终在考虑本机应用程序的区域设置,而snprintf有时会考虑Windows的区域设置.由于问题不一致,抱歉没有提供明确的例子.
那么,snprintf可能在哪些情况下表现不同?为什么我会从这两种方法中获得这种不同的行为?我怎么能避免呢?
PS - 我必须使用这两种方法,所以请建议一个不需要我使用任何不同方法的解决方案.
谢谢.
我想打印一些这样的数据:
John 22
Shakib 25
Ponting 28
Run Code Online (Sandbox Code Playgroud)
在这里,我需要在名称后打印一些尾随空格.
我这样做了:
char *name[]={"John", "Shakib", "Ponting"};
int age[]={22, 25, 28};
int n=3;
for(int i=0; i<n; i++)
{
printf("%s",name[i]);
int cnt=10; // I need trailing spaces upto 10th column
int len=strlen(name[i]);
cnt-=len;
while(cnt)
{
printf(" ");
cnt--;
}
printf("%d\n",age[i]);
}
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以在不使用循环的情况下打印尾随空格?
我想要一个菜单,你可以从中选择一些动作.
问题是,当我们选择一个,并按下"返回"键时,将跳过应该是下一步的用户输入命令.这是为什么 ?
代码是:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int choice;
do
{
printf("Menu\n\n");
printf("1. Do this\n");
printf("2. Do that\n");
printf("3. Leave\n");
scanf("%d",&choice);
switch (choice)
{
case 1:
do_this();
break;
case 2:
// do_that();
break;
}
} while (choice != 3);
return(0);
}
int do_this()
{
char name[31];
printf("Please enter a name (within 30 char) : \n");
gets(name); // I know using gets is bad but I'm just using it
// fgets(name,31,stdin); // gives the …Run Code Online (Sandbox Code Playgroud) 我知道在C中这两个工作:
char* string = "foo";
printf("string value: %s", string);
Run Code Online (Sandbox Code Playgroud)
更简单地说:
printf("string value: %s", "foo");
Run Code Online (Sandbox Code Playgroud)
但我问自己为什么.
我知道%s标识符需要参数为char*,string实际上是(并且它与字符数组相同,因为这两种数据类型在C中非常相似)
但是当我直接传递一个字符串到printf时应该不一样吗?我的意思"foo"是不再是指针......对吗?
//
char ip1[] = "127.0.0.1";
char ip2[] = "211.100.21.179";
printf("ip1: %s\nip2: %s\n", ip1, ip2);
//
long l1 = inet_addr(ip1);
long l2 = inet_addr(ip2);
printf("ip1: %ld\nip2: %ld\n", l1, l2);
//
struct in_addr addr1, addr2;
memcpy(&addr1, &l1, 4);
memcpy(&addr2, &l2, 4);
printf("%u\n", addr1.s_addr);
printf("%u\n", addr2.s_addr);
//
printf("%s\n", inet_ntoa(addr1));
printf("%s\n", inet_ntoa(addr2));
//
printf("%u,%s\n", addr1.s_addr, inet_ntoa(addr1));
printf("%u,%s\n", addr2.s_addr, inet_ntoa(addr2));
printf("%s <--> %s\n", inet_ntoa(addr1), inet_ntoa(addr2));
Run Code Online (Sandbox Code Playgroud)
输出是:
ip1: 127.0.0.1
ip2: 211.100.21.179
ip1: 16777343
ip2: 3004523731
16777343
3004523731
127.0.0.1
211.100.21.179
16777343,127.0.0.1
3004523731,211.100.21.179
211.100.21.179 <--> 211.100.21.179 // why …Run Code Online (Sandbox Code Playgroud) 在编写一些字符串数组的初始化列表时,我不小心错过了一个冒号,这使我观察到printf可以成功打印无效的(0x0)字符串。这是我的C文件:
#include <stdio.h>
const char *names[3]=
{
"a",
"b" // missing colon here made names[1] == "bc"
"c"
};
int main(int argc, char **argv)
{
printf("name [2] = %s",names[2]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译并执行它时,我得到的name [2] = (null)是“怪异的”,因为我认为仅仅崩溃应用程序才有意义,不是吗?我很难找到它的原因是因为我使用的某些字符串不是"b","c"而是诸如的单词null,nothing等等。
我的问题是:(1)为什么没有发出警告?(2)printf这种默认行为为何产生?