非常感谢所有回答的人,我已经意识到我对此非常感兴趣,我会考虑每一个答案,希望我能设法编译一些有用的东西
答案 0 :(得分:3)
一些评论:
free()
后调用num
)。不这样做会导致内存泄漏。printf("%c",num[0]);
只会打印字符串num
的第一个字符。如果要打印整个字符串,请拨打printf("%s",num);
答案 1 :(得分:2)
嗯,这段代码存在很多问题,没有一个与读取大数字有关。但是你还在学习,所以我们走了。按顺序出现在代码中:
malloc
的结果。puts
的末尾添加换行符,否则输出可能会在您不期望的地方结束(即很久以后)。gets
:this page解释原因。if(num == NULL)
(可能是为了检查gets
是否失败,但它会返回< / em> NULL
失败时,num
指针本身不会被更改)。您希望在malloc
。NULL
之后num
检查if
您的代码后,return
之后会继续您的代码,并且您想要添加exit
或if
在printf
的身体里面。 ]
语法错误:您忘记了结束fgets
。 当您决定使用fgets
获取用户输入时,您可以检查字符串中的最后一个字符是否为换行符。如果它不是那么意味着它不能使整个输入适合字符串,所以你需要num[len]='\0';
更多。如果最后一个字符 是一个新行,您可能需要将其删除(使用gets
所需的fgets
技巧,但{{1} }})。
不是将缓冲区的大小增加1,而是应该将其增加一点:一个常用的值是将当前大小加倍。 malloc
,calloc
和realloc
是相当昂贵的系统调用(性能方面),因为您似乎对内存使用不太感兴趣,因此可以节省大量时间将这些电话保持在最低限度。
这些建议的一个例子:
size_t bufferSize = 5000, // start with 5K
inputLength = 0;
char * buffer = malloc(bufferSize);
if(buffer == NULL){
perror("No memory!");
exit(-1);
}
while(fgets(buffer, bufferSize, stdin) != NULL){
inputLength = strlen(buffer);
if(buffer[inputLength] != '\n'){ // last character was not a new-line
bufferSize *= 2; // double the buffer in size
char * tmp = realloc(buffer, bufferSize);
if(tmp == NULL){
perror("No memory!");
free(buffer);
exit(-1);
}
// reallocating didn't fail: continue with grown buffer
buffer = tmp;
}else{
break; // last character was a new-line: were done reading
}
}
注意上面代码中的错误;我有只证明它是正确的,没试过。
最后,您可能需要查看专门用于处理大数字的GNU Multiple Precision library,而不是重新发明轮子。如果有的话,你可以用它来获取灵感。
答案 2 :(得分:1)
这就是你如何去阅读一些非常大的数字。我已经代表你决定一个127位的数字真的很大。
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 128
int main()
{
int n, number, len;
char *num1 = malloc(BUFSIZE * sizeof (char));
if(num1==NULL){
puts("Not enough memory");
return 1;
}
char *num2 = malloc(BUFSIZE * sizeof (char));
if(num2==NULL){
puts("Not enough memory");
return 1;
}
puts("Please enter your first number");
fgets(num1, BUFSIZE, stdin);
puts("Please enter your second number");
fgets(num2, BUFSIZE, stdin);
printf("Your first number is: %s\n", num1);
printf("Your second number is: %s\n", num2);
free(num1);
free(num2);
return 0;
}
这应该是你的起点。