这是我的代码:
#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;
}
我扫描了getdata中的值,但是我在垃圾中扫描。我很确定我的scanf已关闭。另外,我怎样才能通过引用传回我的值数组?我也很难过。感谢大家。
答案 0 :(得分:0)
而不是
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以来的虚假位置 没有初始化。
答案 1 :(得分:0)
我喜欢有对象&#34;已分配&#34;到一个单一的功能。在您的程序中,您的值是在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。
答案 2 :(得分:0)
也代替
printf(“%f”,值+ 2);
使用
printf(“%f”,*(值+ 2));
答案 3 :(得分:0)
有很多错误,我不知道从哪里开始:)
代码完全重写如下。请研究一下。
#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);
}