读数字

时间:2014-03-11 17:43:58

标签: c

非常感谢所有回答的人,我已经意识到我对此非常感兴趣,我会考虑每一个答案,希望我能设法编译一些有用的东西

3 个答案:

答案 0 :(得分:3)

一些评论:

  1. 分配500 MB以防万一似乎不是一个好主意。一个更好的方法是首先分配少量内存,如果它还不够,则分配2倍大内存等(如果你按每个字符读取数字,这将有效)。 重要:在每次(重新)分配之后,你必须检查你的malloc调用是否成功(即它返回的是不是NULL),否则你不能再继续了。
  2. 第一个getchar()用于什么?
  3. 而不是使用gets(),你可以尝试逐个读取字符,直到你遇到一些不是数字的东西,此时你可以假设数字输入已经完成(这是最简单的)显然,人们可以用不同的方式处理用户输入。
  4. 为不需要使用gets()读取的内容添加'\ 0',afaik(对于可以逐个字符读取的内容,这是有意义的。)
  5. 最后但同样重要的是,您还应该注意实际释放已分配的内存(即在完成free()后调用num)。不这样做会导致内存泄漏。
  6. (更新)printf("%c",num[0]);只会打印字符串num的第一个字符。如果要打印整个字符串,请拨打printf("%s",num);

答案 1 :(得分:2)

嗯,这段代码存在很多问题,没有一个与读取大数字有关。但是你还在学习,所以我们走了。按顺序出现在代码中:

  1. (并非真正的错误,但也不建议这样做):如this answer所述,无需投放malloc的结果。
  2. 正如另一个答案所述:分配500MB可能有点矫枉过正,如果你真的需要这么多,你可以随时添加更多,但你可能想要更少(例如5KB)。
  3. 您应该在puts的末尾添加换行符,否则输出可能会在您不期望的地方结束(即很久以后)。
  4. 错误)请勿使用getsthis page解释原因。
  5. 您已经 } 之后检查if(num == NULL) (可能是为了检查gets是否失败,但它会返回< / em> NULL失败时,num指针本身不会被更改)。您希望在malloc
  6. 之后立即执行此检查
  7. NULL之后num检查if您的代码后,return之后会继续您的代码,并且您想要添加exitifprintf的身体里面。
  8. 您上一次]语法错误:您忘记了结束fgets
  9. 当您决定使用fgets获取用户输入时,您可以检查字符串中的最后一个字符是否为换行符。如果它不是那么意味着它不能使整个输入适合字符串,所以你需要num[len]='\0';更多。如果最后一个字符 是一个新行,您可能需要将其删除(使用gets所需的fgets技巧,但{{1} }})。

    不是将缓冲区的大小增加1,而是应该将其增加一点:一个常用的值是将当前大小加倍。 malloccallocrealloc是相当昂贵的系统调用(性能方面),因为您似乎对内存使用不太感兴趣,因此可以节省大量时间将这些电话保持在最低限度。

    这些建议的一个例子:

    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;
}

这应该是你的起点。