帮助scanf函数和内存分配
问题描述:
这里是我的代码:帮助scanf函数和内存分配
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
float** getdata(void);
void calculations(float* fPtr);
//void printoriginal(float* values, int inputnum, float* fPtr);
int main(void)
{
float** fPtr;
float* values;
fPtr = getdata();
calculations(*fPtr);
int element;
// printoriginal(*values, inputnum, *fPtr);
system("PAUSE");
return 0;
}
float getvalues(void)
{
float* values = (float*)calloc(*inputnum, sizeof(float));
float** getdata(void)
{
int i;
int n;
float** fPtr;
int* inputnum;
printf("How many values do you want to input into the array?");
scanf("%d", inputnum);
float* values = (float*)calloc(*inputnum, sizeof(float));
if (values == NULL)
{ printf("Memory overflow\n");
exit(101);
}
for(i = 0; i < *inputnum; i++)
{
n = i + 1;
printf("Please enter your %d number: ", n);
scanf("%f",(values+i));
}
fPtr = (float**)calloc(*inputnum+1, sizeof(float*));
if (fPtr == NULL)
{ printf("Memory overflow\n");
exit(101);
}
for(int c=0; c < *inputnum; c++)
{
*(fPtr+i) = (values+i);
}
printf("%f", values+2);
return fPtr;
}
我SCANF中的GetData值,但我在垃圾扫描。林肯定我的scanf关闭了。另外,我将如何能够通过引用传回我的值数组?我也很难过。感谢大家。
答
而不是
int * inputnum; scanf(..., inputnum);
你想:
int inputnum; scanf(..., &inputnum);
要么,你需要插入inputnum的分配:
/* Very non-C-worthy code sample */ int * inputnum; inputnum = malloc(sizeof *inputnum); if(inputnum == NULL) { perror("malloc"); exit(EXIT_FAILURE); } scanf(..., inputnum);
但看起来会很奇怪熟悉C 的人(除非有其他原因,并且在此 情况下,似乎没有任何理由。)
您所遇到的问题是,scanf函数是 存储在由inputnum指出 的位置,这是一个虚假的位置接收到的值,因为inputnum 未初始化。
答
我喜欢将对象“赋值”为一个单一的函数。在你的程序中,你的值是在函数getdata()
中创建的,在calculations()
中使用并且从未发布。
如果main()
函数对它们负责,那么我认为它会使编码更容易。像
int main(void) {
int inputnum, innum;
double *fPtr;
printf("How many values do you want to input into the array?");
fflush(stdout);
if (scanf("%d", &inputnum) != 1) {
fprintf(stderr, "Error in input. Program aborted.\n");
exit(EXIT_FAILURE);
}
if (inputnum > MAX) { /* ... nothing yet ... */ }
fPtr = calloc(inputnum, sizeof *fPtr);
if (fPtr == NULL) {
fprintf(stderr, "Not enough memory. Program aborted.\n");
exit(EXIT_FAILURE);
}
/* use fPtr in other functions */
innum = data_get(fPtr, inputnum);
data_print(fPtr, innum);
free(fPtr);
return 0;
}
东西在上面的代码片段,我使用的功能data_get()
和data_print()
带着几分不同的原型比你。这些函数带有一个指针和一些元素。
int data_get(double *data, int num);
void data_print(double *data, int num);
第一个读取多达num
双打到内存data
指出,并且返回有效的进入双打的数量。
第二次打印双打数。
哦!除非您有充分的理由使用float
,否则请勿使用它们。始终更喜欢double
s。
答
此外代替
的printf( “%F”,值+ 2); printf(“%f”,*(values + 2));这个函数返回一个数组,
答
有这么多的错误,我不知道从哪里开始:)
下面的代码完全重写。请研究这个。
#include <stdio.h>
#include <stdlib.h>
#define MAX 50
int get_data (float** array); /* must be pointer-to-pointer to return through parameter */
void print_data (const float* array, int size); /* print data */
void do_weird_things (float* array, int size); /* do weird things with the data */
void clear_data (float* array); /* clean up */
int main(void)
{
float* array;
int size;
size = get_data (&array);
printf("Before weird things:\n");
print_data (array, size);
do_weird_things (array, size);
printf("After weird things:\n");
print_data (array, size);
clear_data (array);
system("PAUSE");
return 0;
}
int get_data (float** array)
{
int i;
int items;
printf("How many values do you want to input into the array? ");
scanf("%d", &items);
getchar(); /* remove \n from stdin */
*array = calloc(items, sizeof(float));
if (*array == NULL)
{
printf("Memory overflow\n");
exit(EXIT_FAILURE);
}
for(i = 0; i < items; i++)
{
printf("Please enter your %d number: ", i+1);
scanf("%f", (*array) + i);
getchar(); /* remove \n from stdin */
}
return items;
}
void do_weird_things (float* array, int size) /* do whatever data manipulation you wish here */
{
int i;
for(i=0; i<size; i++)
{
array[i] += i;
}
}
void print_data (const float* array, int size)
{
int i;
for(i=0; i<size; i++)
{
printf("%f\t", array[i]);
}
printf("\n");
}
void clear_data (float* array)
{
free(array);
}