C 阅读数字
非常感谢所有回答的人,我意识到我在这方面很差劲,我会考虑每个答案,希望我能设法编写一些有用的东西一些评论:C 阅读数字,c,C,非常感谢所有回答的人,我意识到我在这方面很差劲,我会考虑每个答案,希望我能设法编写一些有用的东西一些评论: 分配500 MB以防万一似乎不是个好主意。更好的方法是先分配少量内存,如果不够,再分配2倍大的内存,等等(如果您以每个字符为单位读取数字,这将起作用)。 重要信息:在每次(重新)分配之后,您必须检查malloc调用是否成功(即返回的值不为NULL),否则您将无法继续 第一个getchar()用于什么 您可以尝试一个接一个地读取字符,而不是使用get(),直到遇到非数字的字符,这时您可以假设
num
后调用free()
)。不这样做会导致内存泄漏printf(“%c”,num[0])
将只打印字符串的第一个字符num
。如果要打印整个字符串,应调用printf(“%s”,num)代码>
num
后调用free()
)。不这样做会导致内存泄漏printf(“%c”,num[0])
将只打印字符串的第一个字符num
。如果要打印整个字符串,应调用printf(“%s”,num)代码>
嗯,这段代码有很多问题,没有一个与读取大数字有关。但你还在学习,所以我们开始吧。它们在代码中的显示顺序:
malloc
的结果put
的末尾添加一个新行,否则输出可能会在您不希望的地方结束(即,很晚之后)get
:解释原因if(num==NULL)
在您已经使用它之后(可能是为了检查是否获得失败,但失败时它将返回NULL
,不会更改num
指针本身)。您希望将此检查向上移动到malloc
之后的右侧
NULL
-检查num
之后,您的代码在if
之后愉快地继续,您需要在if
的主体中添加返回
或退出
李>
]
李>
当您决定使用fgets
获取用户输入时,可以检查字符串中的最后一个字符是否为新行。如果不是,则意味着它无法将整个输入放入字符串中,因此您需要fgets
更多。当最后一个字符是新行时,您可能希望删除该行(使用num[len]='\0';
技巧,该技巧对于get
,而不是fgets
)
与其只将缓冲区的大小增加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
}
}
注意上面代码中的错误;我只是证明它是正确的,没有试过
最后,与其重新发明轮子,不如看看专门为处理大数字而设计的轮子。如果你能从中获得灵感的话。好吧,这段代码有很多问题,不一定与阅读大数字有关。但你还在学习,所以我们开始吧。它们在代码中的显示顺序:
malloc
的结果#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;
}