读两次字符串?什么是概率? C

时间:2017-06-30 19:37:53

标签: c string function scanf

在我的代码中,我有一个包含4个选项的菜单:

1→我试图读取2个字符串,然后

2→算上'e'-s,

3→退出程序,或

4->打印两个字符串。

int add(char *str1, char *str2){
    int res=0;
    int index=0;
    for(index=0;index<20;index++){
        if( str1[index] == 'e'){
            res++;
        }
        if( str2[index] == 'e'){
            res++;
        }
    }
    return res;
}
void fill(char *str1){
    scanf("%[^\n]s", str1);
}
int main(int argc, const char * argv[]) {
    char c='A';
    int opt=0;
    char s1[20]="The first string";
    char s2[20]="The second string";

    printf(""
           "1. Set Strings\n"
           "2. calc\n"
           "3. ESC\n"
           "");

    while(c!=27){
        scanf("%d", &opt);
        switch(opt){
            case 1:
                fill(s1);
                fill(s2);
                break;
            case 2:
                printf("sumOf'e'=%d\n",add(s1,s2));
                break;
            case 3:
                c=27;
                break;
            default:
                printf("%s, %s", s1, s2);
                break;
        }
    }
    return 0;
}

问题在于阅读:

输出:

   1. Set Strings
    2. calc
    3. ESC
    1
    hey hey
    hey hey hey
    4
    hey hey hey, The second string

所以问题是它只能读入第一个字符串。 有人能解决这个问题吗? 谢谢。

2 个答案:

答案 0 :(得分:1)

scanf的问题在于它的行为与人们通常认为的不同。 scanf是一种“扫描格式化输入”功能,当输入具有常规格式时,它可以很好地工作。对于随机输入,scanf不是最佳选择。看看这个:Why does everyone say not to use scanf? What should I use instead?

如何使用fgets

#include <stdio.h>
#include <string.h>

void cut_nl(char *str)
{
    if(str == NULL)
        return;

    int idx = strlen(str);

    if(str[idx-1] == '\n')
        str[idx-1] = 0;
}

int add(char *str1, char *str2)
{
    if(str1 == NULL)
        str1 = "";

    if(str2 == NULL)
        str2 = "";

    int counter = 0;
    int i;

    int len1 = strlen(str1);
    int len2 = strlen(str2);

    for(i = 0; i < len1; ++i)
        if(str1[i] == 'e')
            counter++;

    for(i = 0; i < len2; ++i)
        if(str2[i] == 'e')
            counter++;

    return counter;
}

int main(void)
{
    // for simplicity's sake, let's assume that the user
    // doesn't input more then 1023 characters
    char line1[1024], line2[1024];


    // here you should check if fgets returns NULL
    fgets(line1, sizeof line1, stdin);
    fgets(line2, sizeof line2, stdin);

    cut_nl(line1);
    cut_nl(line2);

    printf("sumOf 'e': %d\n", add(line1, line2));

    return 0;
}

答案 1 :(得分:0)

以下提议的代码:

  1. 在不使用参数时使用main()的正确签名
  2. 正确检查每次拨打scanf()以确保通话成功
  3. 正确包含所需的头文件
  4. 检查字符串是否出现'e'时,在到达字符串末尾时停止检查每个字符串。
  5. 当用户输入菜单的无效选项时,
  6. 会使用相应的错误消息。
  7. 正确调整用户可为每个输入字符串输入的最大字符数
  8. 警告并不打算检查用户是否输入了“太长”的输入字符串,您应该根据需要通过刷新输入缓冲区来纠正它。
  9. 正确声明每个字符串持有者包含19个字符加上字符串终结符。
  10. 在希望用户进行菜单选择时正确地重新显示菜单
  11. 正确提示用户的每个输入。
  12. 为了便于阅读和理解,通过一个空白行分隔代码块,通过两个空白行分隔功能。
  13. 评论为什么要包含每个头文件。
  14. 建议的代码干净利落地编译。
  15. 注意:用户输入的字符串不能在同一行,用空格分隔,因为每个字符串只停止输入19个字符或遇到换行符'\ n'
  16. 现在建议的代码:

    #include <stdio.h>  // printf(), scanf()
    #include <stdlib.h> // exit(), EXIT_FAILURE
    #include <string.h> // strlen()
    
    
    // prototypes
    int add(char *str1, char *str2);
    void fill(char *str1);
    
    
    int add(char *str1, char *str2)
    {
        int res=0;
    
        for( size_t index=0; index < strlen( str1 ); index++ )
        {
            if( str1[index] == 'e')
            {
                res++;
            }
        }
    
        for( size_t index=0; index < strlen( str2 ); index++ )
        {
            if( str2[index] == 'e')
            {
                res++;
            }
        }
    
        return res;
    } // end of function: add
    
    
    void fill(char *currentStr)
    {
        if ( 1 != scanf(" %19[^\n]", currentStr) )
        {
            fprintf( stderr, "scanf for string failed" );
            exit( EXIT_FAILURE );
        }
    } // end of function: fill
    
    
    int main( void )
    {
        char c='A';
        int opt=0;
        char s1[20]="";
        char s2[20]="";
    
    
    
        while(c!=27)  // not 'esc' key
        {
            printf(""
               "1. Set Strings\n"
               "2. calc\n"
               "3. quit\n");
    
            if( 1 != scanf("%d", &opt) )
            {
                perror( "scanf for menu option failed" );
                exit( EXIT_FAILURE );
            }
    
            switch(opt)
            {
                case 1:
                    printf( "Enter first string, max 19 chars: " );
                    fill(s1);
                    printf( "Enter second string, max 19 chars: " );
                    fill(s2);
                    break;
    
                case 2:
                    printf("sumOf 'e'= %d\n",add(s1,s2));
                    break;
    
                case 3:
                    c=27;
                    break;
    
                default:
                    printf(" %d is an invalid selection\n", opt);
                    break;
            }
        }
        return 0;
    } // end function: main