C 中的数组操作函数
Array-manipulating functions in C
我对 C 语言编程还很陌生,因此决定尝试一些问题。在尝试它们的过程中,我遇到了一个问题,不确定自己是否做对了。
问题要求创建一个函数,该函数使用用户按照建议提供的整数值列表初始化数组参数。我想我做到了。
此外,大小需要由用户输入确定,最大可能接受的列表大小设置为 200。在让用户输入大小方面,我设法做到了,但在可能的情况下最大尺寸它不起作用。
在这里你可以找到我的代码:
#include <stdio.h>
void init_array(int ar[], int size) {
int i;
printf("Please enter %d values: \n");
for (i = 0; i < size; i++) {
scanf("%d", &ar[i]);
}
printf("Elements in array are:");
for (i = 0; i < size; i++) {
printf("%d, ", ar[i]);
}
}
int main() {
int size;
printf("The size of list:");
scanf("%d", &size);
int marks[] = {};
init_array(marks, size);
if(size >=200){
printf(" Limit exceeded");
}
return 0;
}
感谢您的帮助
您正在创建一个零长度数组,您应该将主函数更改为如下所示。
int main() {
int size;
int marks[200];
printf("The size of list:");
scanf("%d", &size);
if(size < 200){
init_array(marks, size);
} else {
printf(" Limit exceeded");
}
return 0;
}
在第一个 printf 语句中,您需要添加 size 作为第二个参数。您还需要在声明数组之前检查限制,并且需要在函数 main 中指定数组的大小(C 中的数组不会根据需要自动增长)。最后,您还应该通过检查 scanf 中的 return 值来验证输入是否为整数。这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
void read_int(int *i) {
int n = scanf("%d", i);
if (n != 1) {
fprintf(stderr, "Integer expected\n");
exit(EXIT_FAILURE);
}
}
void init_array(int ar[], int size) {
int i;
printf("Please enter %d values:\n", size);
for (i = 0; i < size; i++) {
read_int(&ar[i]);
}
printf("Elements in array are: ");
for (i = 0; i < size; i++) {
if (i > 0) {
printf(", ");
}
printf("%d", ar[i]);
}
putchar('\n');
}
int main(void) {
const int max_size = 200;
int size;
printf("The size of list: ");
read_int(&size);
if ((size >= 1) && (size <= max_size)) {
int marks[size];
init_array(marks, size);
} else {
fprintf(stderr, "Array size must be between 1 and %d\n", max_size);
exit(EXIT_FAILURE);
}
return 0;
}
首先您需要检查大小是否有限制,然后创建所需大小的数组或停止执行程序。
int main() {
int size;
printf("The size of list:");
scanf("%d", &size);
int marks[size];
if(size >=200){
printf(" Limit exceeded");
return 1;
}
init_array(marks, size);
return 0;
}
您的代码中存在一些重大错误,还有一些方面会产生警告(参见:),应该加以改进。
首先,您在 init_array
函数中首次调用 printf
时省略了 size
参数(对应于给定的 %d
格式说明符)。
其次,您对 marks
的声明是错误的——就目前而言,它正在声明一个零长度的数组(或者更确切地说,试图这样做)。所以,假设你有一个支持可变长度数组的 C 编译器(VLA——大多数支持,但有些,尤其是 MSVC,不支持),你应该将其声明为 int marks[size];
after 您已经阅读了 size
的值(最好是在您确认 size
的给定值是可接受的之后)。另请注意,您不能使用初始化列表( = {0, 1, }
语法)初始化 VLA。如果您不想使用 VLA,那么您可以为数组指定一个固定的(很可能是 200)最大大小。
一些会产生警告的问题 and/or 可以改进:
在 C 中,通常更好的做法(恕我直言)添加一个 explicit void
作为不带参数的函数的正式参数列表。相关阅读:What are the valid signatures for C's main() function? 尽管在函数 definition 中(相对于 prototype),空的 ()
是有效代码。
您真的应该养成检查调用 scanf
(和相关函数)返回的值的习惯,以确保提供了有效的输入。在下面的代码中,我为 main
函数中的调用添加了这样的检查,但您也应该在 init_array
函数中添加类似的检查。
当 size
的值超过 200 时,您的程序可能不会 运行 init_array
函数;因此,您应该在初始化 marks
数组之前检查该值。
这是您的代码版本,其中包含我在上面列出的更改:
#include <stdio.h>
void init_array(int ar[], int size)
{
int i;
printf("Please enter %d values: \n", size); // You need to give "size" as an argument
for (i = 0; i < size; i++) {
scanf("%d", &ar[i]); // You should add a check for valid input here, as I have done in main
}
printf("Elements in array are:");
for (i = 0; i < size; i++) {
printf("%d, ", ar[i]);
}
}
int main(void) // Better with the explicit "void" argument list specifier
{
int size;
printf("The size of list:");
if (scanf("%d", &size) != 1 || size < 1) { // You should ALWAYS check the return value of a scanf call
printf("Invalid size input.\n");
return 1;
}
int marks[size]; // Need to specify the size and note that you cannot initialize a VLA
// int marks[200] = { 0, }; // Alternative if not using VLA.
if (size >= 200) {
printf(" Limit exceeded.\n");
return 2;
}
init_array(marks, size);
return 0;
}
请随时询问任何进一步的说明and/or解释。
我对 C 语言编程还很陌生,因此决定尝试一些问题。在尝试它们的过程中,我遇到了一个问题,不确定自己是否做对了。
问题要求创建一个函数,该函数使用用户按照建议提供的整数值列表初始化数组参数。我想我做到了。
此外,大小需要由用户输入确定,最大可能接受的列表大小设置为 200。在让用户输入大小方面,我设法做到了,但在可能的情况下最大尺寸它不起作用。
在这里你可以找到我的代码:
#include <stdio.h>
void init_array(int ar[], int size) {
int i;
printf("Please enter %d values: \n");
for (i = 0; i < size; i++) {
scanf("%d", &ar[i]);
}
printf("Elements in array are:");
for (i = 0; i < size; i++) {
printf("%d, ", ar[i]);
}
}
int main() {
int size;
printf("The size of list:");
scanf("%d", &size);
int marks[] = {};
init_array(marks, size);
if(size >=200){
printf(" Limit exceeded");
}
return 0;
}
感谢您的帮助
您正在创建一个零长度数组,您应该将主函数更改为如下所示。
int main() {
int size;
int marks[200];
printf("The size of list:");
scanf("%d", &size);
if(size < 200){
init_array(marks, size);
} else {
printf(" Limit exceeded");
}
return 0;
}
在第一个 printf 语句中,您需要添加 size 作为第二个参数。您还需要在声明数组之前检查限制,并且需要在函数 main 中指定数组的大小(C 中的数组不会根据需要自动增长)。最后,您还应该通过检查 scanf 中的 return 值来验证输入是否为整数。这是修改后的版本:
#include <stdio.h>
#include <stdlib.h>
void read_int(int *i) {
int n = scanf("%d", i);
if (n != 1) {
fprintf(stderr, "Integer expected\n");
exit(EXIT_FAILURE);
}
}
void init_array(int ar[], int size) {
int i;
printf("Please enter %d values:\n", size);
for (i = 0; i < size; i++) {
read_int(&ar[i]);
}
printf("Elements in array are: ");
for (i = 0; i < size; i++) {
if (i > 0) {
printf(", ");
}
printf("%d", ar[i]);
}
putchar('\n');
}
int main(void) {
const int max_size = 200;
int size;
printf("The size of list: ");
read_int(&size);
if ((size >= 1) && (size <= max_size)) {
int marks[size];
init_array(marks, size);
} else {
fprintf(stderr, "Array size must be between 1 and %d\n", max_size);
exit(EXIT_FAILURE);
}
return 0;
}
首先您需要检查大小是否有限制,然后创建所需大小的数组或停止执行程序。
int main() {
int size;
printf("The size of list:");
scanf("%d", &size);
int marks[size];
if(size >=200){
printf(" Limit exceeded");
return 1;
}
init_array(marks, size);
return 0;
}
您的代码中存在一些重大错误,还有一些方面会产生警告(参见:
首先,您在 init_array
函数中首次调用 printf
时省略了 size
参数(对应于给定的 %d
格式说明符)。
其次,您对 marks
的声明是错误的——就目前而言,它正在声明一个零长度的数组(或者更确切地说,试图这样做)。所以,假设你有一个支持可变长度数组的 C 编译器(VLA——大多数支持,但有些,尤其是 MSVC,不支持),你应该将其声明为 int marks[size];
after 您已经阅读了 size
的值(最好是在您确认 size
的给定值是可接受的之后)。另请注意,您不能使用初始化列表( = {0, 1, }
语法)初始化 VLA。如果您不想使用 VLA,那么您可以为数组指定一个固定的(很可能是 200)最大大小。
一些会产生警告的问题 and/or 可以改进:
在 C 中,通常更好的做法(恕我直言)添加一个 explicit void
作为不带参数的函数的正式参数列表。相关阅读:What are the valid signatures for C's main() function? 尽管在函数 definition 中(相对于 prototype),空的 ()
是有效代码。
您真的应该养成检查调用 scanf
(和相关函数)返回的值的习惯,以确保提供了有效的输入。在下面的代码中,我为 main
函数中的调用添加了这样的检查,但您也应该在 init_array
函数中添加类似的检查。
当 size
的值超过 200 时,您的程序可能不会 运行 init_array
函数;因此,您应该在初始化 marks
数组之前检查该值。
这是您的代码版本,其中包含我在上面列出的更改:
#include <stdio.h>
void init_array(int ar[], int size)
{
int i;
printf("Please enter %d values: \n", size); // You need to give "size" as an argument
for (i = 0; i < size; i++) {
scanf("%d", &ar[i]); // You should add a check for valid input here, as I have done in main
}
printf("Elements in array are:");
for (i = 0; i < size; i++) {
printf("%d, ", ar[i]);
}
}
int main(void) // Better with the explicit "void" argument list specifier
{
int size;
printf("The size of list:");
if (scanf("%d", &size) != 1 || size < 1) { // You should ALWAYS check the return value of a scanf call
printf("Invalid size input.\n");
return 1;
}
int marks[size]; // Need to specify the size and note that you cannot initialize a VLA
// int marks[200] = { 0, }; // Alternative if not using VLA.
if (size >= 200) {
printf(" Limit exceeded.\n");
return 2;
}
init_array(marks, size);
return 0;
}
请随时询问任何进一步的说明and/or解释。