我有这个数组
uint8_t *buffer = "JOHN:DOE:010119:M:FOO:BAR";
Run Code Online (Sandbox Code Playgroud)
我想逐字段地将它复制到数据结构中
typedef struct{
uint8_t firstName[5];
uint8_t pad1;
uint8_t lastName[4];
uint8_t pad2;
uint8_t dateOfBirth[7];
uint8_t pad3;
uint8_t genre;
uint8_t pad4;
uint8_t car[4];
uint8_t pad5;
uint8_t phone[4];
uint8_t pad6;
}DataStructTypeDef;
Run Code Online (Sandbox Code Playgroud)
假设所有长度都是固定的(例如firstName
,总是由4个字符,lastName
3个等等组成......)
我用这种方法:
DataStructTypeDef foo;
memcpy((void *)&foo, (void *)buffer, sizeof(DataStructTypeDef));
Run Code Online (Sandbox Code Playgroud)
当我尝试打印时,dateOfBirth
它显示从01012019开始的整个数组
int main(void)
{
DataStructTypeDef foo;
memcpy((void *)&foo, (void *)buffer, sizeof(DataStructTypeDef));
printf("%s", foo.dateOfBirth); // It prints 010119:M:FOO:BAR
//printf("%s", foo.dateOfBirth); // Expected value 010119
return 0;
}
Run Code Online (Sandbox Code Playgroud) 假设我将 tm 中的时间设置为 23:00:00
ptm->tm_hour = 23; ptm->tm_min = 0; ptm->tm_sec = 0;
Run Code Online (Sandbox Code Playgroud)
我想允许用户从中减去时间
ptm->tm_hour -= hourinput; ptm->tm_min -= minuteinput; ptm->tm_sec -= secondinput;
Run Code Online (Sandbox Code Playgroud)
如果用户减去 0 小时 5 分 5 秒,则不会显示为 22:54:55,而是显示为 23:-5:-5。
我想我可以做一堆 if 语句来检查 ptm 是否低于 0 并解释这一点,但是有没有更有效的方法来获得正确的时间?
#include <stdio.h>
int main() {
unsigned int a = -10;
printf("a=%d\n", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是打印-10
签名int
.如果签名和未签名都打印,-10
那么它们之间有什么区别?
当打印来自用户的读取输入的值时,数字下溢和溢出,我不明白为什么。
因此,我正在通过ansi C标准来选择c作为一种语言,并且我不明白为什么这会导致前两个值下溢和溢出。
int c;
int nl, bl, tab= 0;
while ((c = getchar())!= EOF){
if (c == '\n'){
++nl;
}
if (c == ' '){
++bl;
}
if (c == '\t'){
++tab;
}
printf("%d\t %d\t %d\n", nl, bl, tab);
}
Run Code Online (Sandbox Code Playgroud) 我有2个char
类型的变量。
char desc[30];
char code[2];
cout << "Enter values : "<<"\n";
cin.getline(desc,30);
cin.getline(code,2);
cout << "\nValues Entered: "<<"\n";
cout << desc <<"\t";
cout << code <<"\n";
Run Code Online (Sandbox Code Playgroud)
当按如下所示提供输入值时,第二个变量的第二个字符将丢失。我尝试了cin>>marks
和cin.get(marks,2)
,但是行为始终相同。
输入值: 这是一条测试线 LH 输入的值: 这是测试线L 进程返回0(0x0)执行时间:11.285 s 按任意键继续。
在上面的示例中,即使输入为LH
,在输出中也只有'L'可用而'H'丢失了。有人可以告诉我这里有什么问题吗?
我正在关注"C Primer Plus"一书并遇到这样一段代码:
// designate.c -- use designated initializers
#include <stdio.h>
#define MONTHS 12
int main(void)
{
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
int i;
for (i = 0; i < MONTHS; i++)
printf("%2d %d\n", i+1, days[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它在编译时报告错误:
$ cc designate.c
designate.c:6:57: warning: initializer overrides prior initialization of this subobject [-Winitializer-overrides]
int days[MONTHS] = {31, 28, [4] = 31, 30, 31, [1] = 29};
^~
designate.c:6:29: note: previous initialization is …
Run Code Online (Sandbox Code Playgroud) 我正在阅读我正在阅读的C++书籍中的以下代码片段.
int* operator=(const int& rhs, int *x)
{
int *tmpx=x //line 1
x = new int(2) //line 2
delete tmpx; //line 3
return x; //line 4
}
Run Code Online (Sandbox Code Playgroud)
我怀疑的是,如果我在第3行删除tmpx,它将地址保存到x指向的内存位置,并且删除将使内存地址无效,那么返回指向内存地址的x不是错误的在第3行获释?
我尝试了以下代码:
int a[4] = {0};
int b[4] = {5};
int c[4];
printf("%d %d %d %d %d %d\n", a[0], a[3] , b[0], b[3], c[0], c[3]);
Run Code Online (Sandbox Code Playgroud)
得到以下结果:
0 0 5 0 random random
Run Code Online (Sandbox Code Playgroud)
虽然我得到了为什么我得到了c
数组的随机值,我不明白为什么分配{5}
不起作用{0}
,只是初始化数组的第一个元素.
有没有办法将数组b
元素初始化为不同于0的相同值?(不使用memset或for循环)
因此,我对以下解释感到好奇,如果我在printf部分使用%s,为什么我的代码会得到不同的结果。我知道工作的人应该使用%s代替%c。
#include <stdio.h>
int main() {
int i;
char str1[12] = "Hello world!";
printf("str1==%c\n", str1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试多次编译它,并且在两次之间得到一些不同的结果:str1 == ?、 str1 ==,str1 ==(此空白实际上是该站点无法显示的某些图标)
当代码执行变量num获取值时'9'
,就会发生错误。
char num = 'A';
int* pnum = (int *)#
*pnum = '9';
Run Code Online (Sandbox Code Playgroud)
错误是什么意思?