C 阅读数字

C 阅读数字,c,C,非常感谢所有回答的人,我意识到我在这方面很差劲,我会考虑每个答案,希望我能设法编写一些有用的东西一些评论: 分配500 MB以防万一似乎不是个好主意。更好的方法是先分配少量内存,如果不够,再分配2倍大的内存,等等(如果您以每个字符为单位读取数字,这将起作用)。 重要信息:在每次(重新)分配之后,您必须检查malloc调用是否成功(即返回的值不为NULL),否则您将无法继续 第一个getchar()用于什么 您可以尝试一个接一个地读取字符,而不是使用get(),直到遇到非数字的字符,这时您可以假设

非常感谢所有回答的人,我意识到我在这方面很差劲,我会考虑每个答案,希望我能设法编写一些有用的东西

一些评论:

  • 分配500 MB以防万一似乎不是个好主意。更好的方法是先分配少量内存,如果不够,再分配2倍大的内存,等等(如果您以每个字符为单位读取数字,这将起作用)。 重要信息:在每次(重新)分配之后,您必须检查malloc调用是否成功(即返回的值不为NULL),否则您将无法继续
  • 第一个getchar()用于什么
  • 您可以尝试一个接一个地读取字符,而不是使用get(),直到遇到非数字的字符,这时您可以假设数字输入已经完成(这是最简单的方法,显然可以以不同的方式处理用户输入)
  • 对于使用gets()读取的内容,不需要添加“\0”(对于可以逐个字符读取的内容,这是有意义的)
  • 最后但并非最不重要的一点是,您还应该注意实际释放分配的内存(即在使用
    num
    后调用
    free()
    )。不这样做会导致内存泄漏
  • (更新)
    printf(“%c”,num[0])
    将只打印字符串的第一个字符
    num
    。如果要打印整个字符串,应调用
    printf(“%s”,num)
  • 一些评论:

  • 分配500 MB以防万一似乎不是个好主意。更好的方法是先分配少量内存,如果不够,再分配2倍大的内存,等等(如果您以每个字符为单位读取数字,这将起作用)。 重要信息:在每次(重新)分配之后,您必须检查malloc调用是否成功(即返回的值不为NULL),否则您将无法继续
  • 第一个getchar()用于什么
  • 您可以尝试一个接一个地读取字符,而不是使用get(),直到遇到非数字的字符,这时您可以假设数字输入已经完成(这是最简单的方法,显然可以以不同的方式处理用户输入)
  • 对于使用gets()读取的内容,不需要添加“\0”(对于可以逐个字符读取的内容,这是有意义的)
  • 最后但并非最不重要的一点是,您还应该注意实际释放分配的内存(即在使用
    num
    后调用
    free()
    )。不这样做会导致内存泄漏
  • (更新)
    printf(“%c”,num[0])
    将只打印字符串的第一个字符
    num
    。如果要打印整个字符串,应调用
    printf(“%s”,num)

  • 嗯,这段代码有很多问题,没有一个与读取大数字有关。但你还在学习,所以我们开始吧。它们在代码中的显示顺序:

  • (并非真正的错误,但也不推荐):如中所述,不需要强制转换
    malloc
    的结果
  • 正如另一个答案所指出的:分配500MB可能有点过头了,如果你真的需要这么多,你总是可以添加更多,但你可能希望从更少开始(例如5KB)
  • 您应该在
    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
    的结果
  • 正如另一个答案所指出的:如果你真的需要这么多,那么分配500MB可能太过了
    #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;
    }