當您從用戶那里獲得未知數量的整數并對其進行處理時,我正在嘗試撰寫初學者 c 代碼。由于在不決定大小的情況下初始化整數陣列是無效的,我想知道我是否可以做一些技巧來提高我的代碼效率。目前我正在初始化一個大小為 999 的陣列,并要求用戶不要超出這個邊界。示例代碼:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[999];
printf("After entering numbers enter -1 to stop: \n");
for(int i=0;i<999;i )
{
printf("Enter number(%d): ",i 1);
scanf("%d",&a[i]);
if(a[i]==-1) break;
if(i==998)
{
printf("Max limit reached.");
break;
}
}
//some code for processing the numbers
}
uj5u.com熱心網友回復:
2 個選項:a) 詢問用戶有多少項并使用可變長度陣列(在 C99 中添加到標準 C;在 C11 中成為可選)...或 b) 使用動態記憶體并不斷增長陣列。
選項 a)
printf("enter number of items: ");
fflush(stdout);
char input[100];
fgets(input, sizeof input, stdin); // error checking ommited
size_t n = strtol(input, 0, 10); // error checking ommited
int array[n]; // VLA
// use array
選項 b)
size_t reserved = 5; used = 0;
int *array = malloc(reserved * sizeof *array); // start with space for 5 items
for (;;) {
if (used == reserved) {
// grow array
reserved *= 2;
int *tmp = realloc(array, reserved * sizeof *tmp);
if (!tmp) exit(EXIT_FAILURE); // not enough memory
array = tmp;
}
array[used ] = getint(); // get integer from user/file/network/...
// find way to leave for loop
}
// optionaly shrink the array
if (used < reserved) {
int *tmp = realloc(array, used * sizeof *tmp);
if (!tmp) exit(EXIT_FAILURE);
array = tmp;
}
// use array
free(array);
如果專案的數量可以很大以免導致堆疊溢位,則選項 b) 是首選。
uj5u.com熱心網友回復:
一個明智的選擇是忘記scanf并使用命令列引數。更快,可能更安全(如果添加上限檢查),消耗的記憶體更少。
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char* argv[])
{
if(argc < 2) // or if(argc < 2 || argc > SOME_UPPER_LIMIT)
return 0;
size_t size = argc-1;
int input [size];
for(size_t i=0; i<size; i )
{
input[i] = strtol(argv[i 1],NULL,10);
printf("%d ", input[i]);
}
}
例如執行:myprog 12 34 56 78-> 輸出12 34 56 78。
uj5u.com熱心網友回復:
你也可以使用它:
#define MAXSIZE 999
void getNums(int nums[]){
int i = 0, temp;
char c;
while(((c=getchar())!='\n') && (i < MAXSIZE-1)){
temp = c - '0';
nums[i] = temp;
i ;
}
nums[i] = '\0';
}
int main(){
int nums[MAXSIZE];
getNums(nums);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465481.html
上一篇:如何指示PowerShell7在Windows10上的WSL2中運行bash(Ubuntu)腳本?
下一篇:C語言中的斐波那契演算法
