什么时候我应该使用带有scanf(&)的&符号

使用scanf()在c中使用&符有什么规则? struct Student { char name[20]; int id; }; void main() { struct Student std1; printf(“enter name and id of std1\n”); scanf(“%s %d”, std1.name, &(std1.id)); } 为什么对于String我不需要使用&符号和int我必须使用它? 是否有关于何时使用&符号的规则?

如何scanf只有整数?

我希望代码运行直到用户输入整数值。 该代码适用于char和char数组。 我做了以下事情: #include int main() { int n; printf(“Please enter an integer: “); while(scanf(“%d”,&n) != 1) { printf(“Please enter an integer: “); while(getchar() != ‘\n’); } printf(“You entered: %d\n”,n); return 0; } 问题是如果用户输入浮点值, scanf将接受它。 Please enter an integer: abcd Please enter an integer: a Please enter an integer: 5.9 You entered: 5 怎么可以避免?

C中的序列点和副作用

在这个C-FAQ中给出了序列点 ; 标准规定: 在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的计算修改一次。 此外,只能访问先前值以确定要存储的值。 在例子中 i = i++; a[i] = i++; 从声明的第一句可以清楚地看出,这些例子是未定义行为的结果。 在解释声明的第二句时,据说; 第二句话说: 如果一个对象被写入一个完整的表达式,那么在同一个表达式中对它的任何和所有访问都必须直接参与计算要写入的值。 此规则有效地将法律表达式约束为在修改之前明显存在访问的表达式。 例如,旧备用 i = i + 1 是允许的,因为i的访问用于确定i的最终值。 这个例子 a[i] = i++ 是不允许的,因为i的一个访问(a [i]中的一个)与最终存储在i中的值无关(在i ++中发生),因此没有好的方法来定义。 我的问题是; 1.它是什么意思, 如果一个对象被写入一个完整的表达式,那么在同一个表达式中对它的任何和所有访问必须直接参与计算要写入的值。 ? 2.它是什么意思,例子a[i] = i++ 是不被允许的,因为i的一个访问(a [i]中的一个)与最终存储在i中的值无关(其中发生在i ++) 有人可以用一些简单的方法解释它吗?

数组衰减成指针

请帮我理解下面的程序。 #include int main() { int a[7]; a[0] = 1976; a[1] = 1984; printf(“memory location of a: %p”, a); printf(“value at memory location %p is %d”, a, *a); printf(“value at memory location %p is %d”, &a[1], a[1]); return 0; } &a[1]和&a+1 。 它们是相同还是不同? #include int main() { int v[10]; int **p; int *a[5]; v[0] = […]

strtok分段错误

我试图理解为什么下面的代码片段给出了分段错误: void tokenize(char* line) { char* cmd = strtok(line,” “); while (cmd != NULL) { printf (“%s\n”,cmd); cmd = strtok(NULL, ” “); } } int main(void) { tokenize(“this is a test”); } 我知道strtok()实际上并没有对字符串文字进行标记,但在这种情况下, line直接指向字符串”this is a test” ,它在内部是一个char数组。 是否有任何令牌化line而不将其复制到数组中?

从K&R书中解释malloc的这种实现

这是Kernighan和Ritchie关于C的书的摘录。 它显示了如何实现malloc一个版本。 虽然评论很好,但我很难理解它。 有人可以解释一下吗? typedef long Align; /* for alignment to long boundary */ union header { /* block header */ struct { union header *ptr; /* next block if on free list */ unsigned size; /* size of this block */ } s; Align x; /* force alignment of blocks */ }; typedef union […]

简单的C scanf不起作用?

如果我尝试以下内容: int anint; char achar; printf(“\nEnter any integer:”); scanf(“%d”, &anint); printf(“\nEnter any character:”); scanf(“%c”, &achar); printf(“\nHello\n”); printf(“\nThe integer entered is %d\n”, anint); printf(“\nThe char entered is %c\n”, achar); 它允许输入一个整数,然后完全跳过第二个scanf ,这真的很奇怪,因为当我交换两个(首先是char scanf)时,它工作正常。 究竟是什么错了?

在获取之前输入C. Scanf。 问题

我是C的新手,我在向程序输入数据时遇到了问题。 我的代码: #include #include #include int main(void) { int a; char b[20]; printf(“Input your ID: “); scanf(“%d”, &a); printf(“Input your name: “); gets(b); printf(“———“); printf(“Name: %s”, b); system(“pause”); return 0; } 它允许输入ID,但它只是跳过其余的输入。 如果我改变这样的顺序: printf(“Input your name: “); gets(b); printf(“Input your ID: “); scanf(“%d”, &a); 它会工作。 虽然,我不能改变秩序,我需要它原样。 有人能帮我吗 ? 也许我需要使用其他一些function。 谢谢!

零长度数组

最近我遇到了一个结构定义, struct arr { int cnt; struct { int size; int *name; } list[0]; }; 现在我不知道list[0]被宣布的原因。 我感兴趣的是为什么使用它。 它有什么优势吗? 如果是,那是什么?

对多维数组的一维访问:它是明确定义的行为吗?

我想我们都同意,通过以一维方式解引用(可能是偏移的)指向其第一个元素的指针来访问真正的多维数组被认为是惯用的C,例如: void clearBottomRightElement(int *array, int M, int N) { array[M*N-1] = 0; // Pretend the array is one-dimensional } int mtx[5][3]; … clearBottomRightElement(&mtx[0][0], 5, 3); 然而,我的语言律师需要说服这实际上是明确定义的C! 特别是: 标准是否保证编译器不会在例如mtx[0][2]和mtx[1][0]之间插入填充? 通常,索引关闭数组的末尾(除了结尾之外)是未定义的(C99,6.5.6 / 8)。 所以以下内容显然未定义: struct { int row[3]; // The object in question is an int[3] int other[10]; } foo; int *p = &foo.row[7]; // ERROR: A […]