Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么getchar()不';但getchar_unlocked()在读取字符串时是否在主函数之外工作?_C_String_Getchar - Fatal编程技术网

为什么getchar()不';但getchar_unlocked()在读取字符串时是否在主函数之外工作?

为什么getchar()不';但getchar_unlocked()在读取字符串时是否在主函数之外工作?,c,string,getchar,C,String,Getchar,在read()函数中,当我使用getchar()时,它只读取一个字符。即使while()中的条件为true,但getchar\u unlocked()读取字符直到给定条件失败,它也会中断循环 代码用于计算最大值,如: input : 4 8-6+2+4+3-6+1 1+1+1+1 2+3+6+8-9 2+7+1-6 output : 10 //(which is max value of 3rd string) 代码: #包括 内联整数读取(整数*值){ 字符c,c1='+'; *数值=0

在read()函数中,当我使用getchar()时,它只读取一个字符。即使while()中的条件为true,但getchar\u unlocked()读取字符直到给定条件失败,它也会中断循环 代码用于计算最大值,如:

input :
4
8-6+2+4+3-6+1
1+1+1+1
2+3+6+8-9
2+7+1-6

output : 
10 //(which is max value of 3rd string)
代码:

#包括
内联整数读取(整数*值){
字符c,c1='+';
*数值=0;
c=getchar_unlocked();
而((c>='0'&&c max?val:max;
}
printf(“%d”,最大值);
返回0;
}

以下建议的代码:

#include <stdio.h>   // scanf(), getchar()
#include <limits.h>  // INT_MIN
#include <ctype.h>   // isdigit()
#include <stdlib.h>  // exit(), EXIT_FAILURE


inline int myRead( void )
{
    int c;
    char  c1 = '+';

    int value = 0;

    while( (c = getchar()) != EOF && '\n' != c )
    {
        if (c == '+' || c == '-')
            c1 = (char)c;

        else if( isdigit( c ) )
            value = (c1=='+' ? value + (c-'0') : value - (c-'0'));
    }
    return value;
}


int main( void )
{
    int n;
    int max = INT_MIN;
    int val;

    if( 1 != scanf("%d", &n) )
    {
        fprintf( stderr, "scanf for number of following lines failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, scanf successful

    while(n--)
    {
        val = myRead();
        max = val>max?val:max;
    }

    printf("%d\n", max);
    return 0;
}
  • 干净地编译
  • 执行所需的功能
  • 正确处理除0…9和“+”和“-”以外的字符
  • 正确检查I/O错误

  • 为便于阅读和理解而格式化
  • 记录包含每个头文件的原因
  • 使用与C库名称不冲突的函数名称
  • 正确地将格式字符串终止为
    printf()
    ,以便数据立即显示在终端上
  • 如果输入中的行数不足以匹配第一行上的数字,则仍然包含潜在问题
  • 现在建议的守则是:

    #include <stdio.h>   // scanf(), getchar()
    #include <limits.h>  // INT_MIN
    #include <ctype.h>   // isdigit()
    #include <stdlib.h>  // exit(), EXIT_FAILURE
    
    
    inline int myRead( void )
    {
        int c;
        char  c1 = '+';
    
        int value = 0;
    
        while( (c = getchar()) != EOF && '\n' != c )
        {
            if (c == '+' || c == '-')
                c1 = (char)c;
    
            else if( isdigit( c ) )
                value = (c1=='+' ? value + (c-'0') : value - (c-'0'));
        }
        return value;
    }
    
    
    int main( void )
    {
        int n;
        int max = INT_MIN;
        int val;
    
        if( 1 != scanf("%d", &n) )
        {
            fprintf( stderr, "scanf for number of following lines failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, scanf successful
    
        while(n--)
        {
            val = myRead();
            max = val>max?val:max;
        }
    
        printf("%d\n", max);
        return 0;
    }
    
    #包括//scanf(),getchar()
    #包括//INT\u MIN
    #include//isdigit()
    #包括//退出(),退出失败
    内联int myRead(void)
    {
    INTC;
    字符c1='+';
    int值=0;
    而((c=getchar())!=EOF&&'\n'!=c)
    {
    如果(c=='+'| | c=='-')
    c1=(char)c;
    否则,如果(i数字(c))
    value=(c1='+'?value+(c-'0'):value-(c-'0');
    }
    返回值;
    }
    内部主(空)
    {
    int n;
    int max=int_MIN;
    int-val;
    如果(1!=scanf(“%d”、&n))
    {
    fprintf(stderr,“扫描以下失败行数”);
    退出(退出失败);
    }
    //否则,scanf将成功
    而(n--)
    {
    val=myRead();
    max=val>max?val:max;
    }
    printf(“%d\n”,最大值);
    返回0;
    }
    
    以下建议的代码:

    #include <stdio.h>   // scanf(), getchar()
    #include <limits.h>  // INT_MIN
    #include <ctype.h>   // isdigit()
    #include <stdlib.h>  // exit(), EXIT_FAILURE
    
    
    inline int myRead( void )
    {
        int c;
        char  c1 = '+';
    
        int value = 0;
    
        while( (c = getchar()) != EOF && '\n' != c )
        {
            if (c == '+' || c == '-')
                c1 = (char)c;
    
            else if( isdigit( c ) )
                value = (c1=='+' ? value + (c-'0') : value - (c-'0'));
        }
        return value;
    }
    
    
    int main( void )
    {
        int n;
        int max = INT_MIN;
        int val;
    
        if( 1 != scanf("%d", &n) )
        {
            fprintf( stderr, "scanf for number of following lines failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, scanf successful
    
        while(n--)
        {
            val = myRead();
            max = val>max?val:max;
        }
    
        printf("%d\n", max);
        return 0;
    }
    
  • 干净地编译
  • 执行所需的功能
  • 正确处理除0…9和“+”和“-”以外的字符
  • 正确检查I/O错误

  • 为便于阅读和理解而格式化
  • 记录包含每个头文件的原因
  • 使用与C库名称不冲突的函数名称
  • 正确地将格式字符串终止为
    printf()
    ,以便数据立即显示在终端上
  • 如果输入中的行数不足以匹配第一行上的数字,则仍然包含潜在问题
  • 现在建议的守则是:

    #include <stdio.h>   // scanf(), getchar()
    #include <limits.h>  // INT_MIN
    #include <ctype.h>   // isdigit()
    #include <stdlib.h>  // exit(), EXIT_FAILURE
    
    
    inline int myRead( void )
    {
        int c;
        char  c1 = '+';
    
        int value = 0;
    
        while( (c = getchar()) != EOF && '\n' != c )
        {
            if (c == '+' || c == '-')
                c1 = (char)c;
    
            else if( isdigit( c ) )
                value = (c1=='+' ? value + (c-'0') : value - (c-'0'));
        }
        return value;
    }
    
    
    int main( void )
    {
        int n;
        int max = INT_MIN;
        int val;
    
        if( 1 != scanf("%d", &n) )
        {
            fprintf( stderr, "scanf for number of following lines failed" );
            exit( EXIT_FAILURE );
        }
    
        // implied else, scanf successful
    
        while(n--)
        {
            val = myRead();
            max = val>max?val:max;
        }
    
        printf("%d\n", max);
        return 0;
    }
    
    #包括//scanf(),getchar()
    #包括//INT\u MIN
    #include//isdigit()
    #包括//退出(),退出失败
    内联int myRead(void)
    {
    INTC;
    字符c1='+';
    int值=0;
    而((c=getchar())!=EOF&&'\n'!=c)
    {
    如果(c=='+'| | c=='-')
    c1=(char)c;
    否则,如果(i数字(c))
    value=(c1='+'?value+(c-'0'):value-(c-'0');
    }
    返回值;
    }
    内部主(空)
    {
    int n;
    int max=int_MIN;
    int-val;
    如果(1!=scanf(“%d”、&n))
    {
    fprintf(stderr,“扫描以下失败行数”);
    退出(退出失败);
    }
    //否则,scanf将成功
    而(n--)
    {
    val=myRead();
    max=val>max?val:max;
    }
    printf(“%d\n”,最大值);
    返回0;
    }
    
    只有在多线程程序中才会出现
    getchar()和
    getchar\u unlocked()
    之间的差异。否则,它们的行为相同。因此,您的诊断似乎不可能和/或不可信。请确定您使用的平台(o/s和编译器)。请注意编写函数
    read()
    在POSIX程序中如履薄冰。
    getchar
    getchar\u unlocked
    都返回
    int
    ,而不是
    char
    (这不是你的问题,但是养成使用
    int
    的习惯很好),以便于可读性和理解:1)单独的代码块(for、if、else、while、do…while、switch、case、default)通过一个空行。2)用2或3个空行分隔函数(保持一致)3)遵循公理:每行只有一条语句,每语句(最多)一条变量声明。函数:
    getchar()
    (及其“相对:
    getchar\u unlocked()
    )读取输入流中的每个字符。包括空格、制表符、换行符等。发布的代码试图将这些非数字字符视为数字。这意味着代码失败。您可能希望使用
    #include
    和工具
    isdigit()
    调用任何
    scanf()
    函数族时,始终检查返回值(而不是参数值)以确保操作成功只有在
    getchar()之间存在差异时
    getchar\u unlocked()
    位于多线程程序中。否则,它们的行为相同。因此,您的诊断似乎不太可能和/或不可信。请确定您正在使用的平台(o/s和编译器)。请注意,在POSIX程序中编写函数
    read()
    是如履薄冰。
    getchar
    getchar\u unlocked
    都返回
    int
    ,而不是
    char
    。(这不是你的问题,但是养成使用
    int
    的习惯是很好的)为了便于阅读和理解:1)通过一个空行分离代码块(例如,if,else,while,do…while,switch,case,default)。2) 用2或3个空行分隔函数(保持一致)3)遵循公理:每行只有一条语句,每语句最多一条变量声明。函数:
    getc