Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. 890927 - Invalid Input Format exception in sscanf_s

890927 - Invalid Input Format exception in sscanf_s

Scheduled Pinned Locked Moved C / C++ / MFC
helpquestion
13 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • I Offline
    I Offline
    ilostmyid2
    wrote on last edited by
    #1

    in the following code:

    double a;
    sscanf\_s("0.02", "%.2f", &a);
    

    i get Invalid Input Format exception! what's the problem? i also tried %1.2f and %4.2f, but no change.

    A L 2 Replies Last reply
    0
    • I ilostmyid2

      in the following code:

      double a;
      sscanf\_s("0.02", "%.2f", &a);
      

      i get Invalid Input Format exception! what's the problem? i also tried %1.2f and %4.2f, but no change.

      A Offline
      A Offline
      ALLERSLIT
      wrote on last edited by
      #2

      double a;
      sscanf_s("0.02", "%lf", &a);

      I 1 Reply Last reply
      0
      • A ALLERSLIT

        double a;
        sscanf_s("0.02", "%lf", &a);

        I Offline
        I Offline
        ilostmyid2
        wrote on last edited by
        #3

        yes, it works. but since the format is the same as what is used for showing the property (CMFCPropertyGridProperty::m_strFormatDouble), i've to specify the number of digits i want to be shown after the decimal point, so i can't use %lf.

        1 Reply Last reply
        0
        • I ilostmyid2

          in the following code:

          double a;
          sscanf\_s("0.02", "%.2f", &a);
          

          i get Invalid Input Format exception! what's the problem? i also tried %1.2f and %4.2f, but no change.

          L Offline
          L Offline
          Lost User
          wrote on last edited by
          #4

          Your format string is wrong, see here[^] for the width specification in sscanf.

          Just say 'NO' to evaluated arguments for diadic functions! Ash

          I 1 Reply Last reply
          0
          • L Lost User

            Your format string is wrong, see here[^] for the width specification in sscanf.

            Just say 'NO' to evaluated arguments for diadic functions! Ash

            I Offline
            I Offline
            ilostmyid2
            wrote on last edited by
            #5

            thank u, i read it, but i couldn't figure out what to choose as format for a floating point variable with read part of variable digits number and floating point of always two digits.

            L 1 Reply Last reply
            0
            • I ilostmyid2

              thank u, i read it, but i couldn't figure out what to choose as format for a floating point variable with read part of variable digits number and floating point of always two digits.

              L Offline
              L Offline
              Lost User
              wrote on last edited by
              #6

              As it says in the link I showed: The width field is a positive decimal integer controlling the maximum number of characters to be read for that field. No more than width characters are converted and stored at the corresponding argument. Fewer than width characters may be read if a whitespace character (space, tab, or newline) or a character that cannot be converted according to the given format occurs before width is reached.

              So in your case you would code it as

              double a;
              sscanf\_s("0.02", "%4f", &a);
              

              since you have 4 characters in your string value. The number of digits after the decimal point is largely irrelevant for floats and doubles when reading in, it is only important when formatting for output. In general you are better off not specifying a width value as it can lead to loss of precision in input strings - unless your users all know exactly what format to use for their input data.

              Just say 'NO' to evaluated arguments for diadic functions! Ash

              I 1 Reply Last reply
              0
              • L Lost User

                As it says in the link I showed: The width field is a positive decimal integer controlling the maximum number of characters to be read for that field. No more than width characters are converted and stored at the corresponding argument. Fewer than width characters may be read if a whitespace character (space, tab, or newline) or a character that cannot be converted according to the given format occurs before width is reached.

                So in your case you would code it as

                double a;
                sscanf\_s("0.02", "%4f", &a);
                

                since you have 4 characters in your string value. The number of digits after the decimal point is largely irrelevant for floats and doubles when reading in, it is only important when formatting for output. In general you are better off not specifying a width value as it can lead to loss of precision in input strings - unless your users all know exactly what format to use for their input data.

                Just say 'NO' to evaluated arguments for diadic functions! Ash

                I Offline
                I Offline
                ilostmyid2
                wrote on last edited by
                #7

                thank u for the description. the problem is that format strings for sprintf_s and sscanf_s differ. for sscanf_s including a . in format causes Invalid Input Format exception in anyway. as u mentioned, the input string is read by the number of bytes specified in the format b4 f and the chunk string is processed to be converted into a float. while in sprintf_s . has meaning. %4.2f for example means that the output string must contain at least 4 characters and exactly 2 digits after decimal point. if it be needed this may increase, eg. %2.2f or even %1.2f lead to the same output 0.02 or even 123456789.00. this is while we has only one format for a grid ctrl, not two separate formats, one for sprintf_s and one for sscanf_s. as i said b4 it's stored in CMFCPropertyGridProperty::m_strFormatFloat or CMFCPropertyGridProperty::m_strFormatDouble. this uniqueness in the source of the problem. now what's ur suggestion? i've also another problem. spin ctrls are designated for integral fields. i need to attach a spin ctrl to a field of type float. for example when i've 12.34 in the field it may get 11.34 or 13.34 with up and down arrows. if i specify it to limit to 20, after 19.34 it gets 20.00 with arrow up. when i specify low limit of zero it gets 0.00 after 0.34 with arrow down. the spin ctrl doesn't expect the input field to be a float while it doesn't contrast with its behavior. so the summary of the two problems are: 1. how can i overcome the uniqueness of floating point fields format in a grid ctrl which is both used for showing and inputting? 2. how can i have a spin ctrl for a floating point input field? thx

                L I 2 Replies Last reply
                0
                • I ilostmyid2

                  thank u for the description. the problem is that format strings for sprintf_s and sscanf_s differ. for sscanf_s including a . in format causes Invalid Input Format exception in anyway. as u mentioned, the input string is read by the number of bytes specified in the format b4 f and the chunk string is processed to be converted into a float. while in sprintf_s . has meaning. %4.2f for example means that the output string must contain at least 4 characters and exactly 2 digits after decimal point. if it be needed this may increase, eg. %2.2f or even %1.2f lead to the same output 0.02 or even 123456789.00. this is while we has only one format for a grid ctrl, not two separate formats, one for sprintf_s and one for sscanf_s. as i said b4 it's stored in CMFCPropertyGridProperty::m_strFormatFloat or CMFCPropertyGridProperty::m_strFormatDouble. this uniqueness in the source of the problem. now what's ur suggestion? i've also another problem. spin ctrls are designated for integral fields. i need to attach a spin ctrl to a field of type float. for example when i've 12.34 in the field it may get 11.34 or 13.34 with up and down arrows. if i specify it to limit to 20, after 19.34 it gets 20.00 with arrow up. when i specify low limit of zero it gets 0.00 after 0.34 with arrow down. the spin ctrl doesn't expect the input field to be a float while it doesn't contrast with its behavior. so the summary of the two problems are: 1. how can i overcome the uniqueness of floating point fields format in a grid ctrl which is both used for showing and inputting? 2. how can i have a spin ctrl for a floating point input field? thx

                  L Offline
                  L Offline
                  Lost User
                  wrote on last edited by
                  #8

                  1. I'm not sure I understand the problem, if you require different format strings for input and output then you need to code round the problem. 2. Don't use a floting point number, use an integer and multiply by 100 and display in the form you want. You may need to use a separate text box for the display rather than one that is directly connected to the spin control. Thus to display 1.05, you would use a value of 105 and use division and mod to separate the two halves, then display using a format of "%d.%.2d".

                  Just say 'NO' to evaluated arguments for diadic functions! Ash

                  I 1 Reply Last reply
                  0
                  • L Lost User

                    1. I'm not sure I understand the problem, if you require different format strings for input and output then you need to code round the problem. 2. Don't use a floting point number, use an integer and multiply by 100 and display in the form you want. You may need to use a separate text box for the display rather than one that is directly connected to the spin control. Thus to display 1.05, you would use a value of 105 and use division and mod to separate the two halves, then display using a format of "%d.%.2d".

                    Just say 'NO' to evaluated arguments for diadic functions! Ash

                    I Offline
                    I Offline
                    ilostmyid2
                    wrote on last edited by
                    #9

                    all of the problem is that i like to least code, otherwise i would code another CSpinCtrl class as well as another CMFCPropertyGridProperty! 2. i've also to set steps of up and down arrows to 100 instead of increment and decrement. i prefer to use a different class than the original CSpinCtrl instead. 1. i tried to explain accurately! the problem is that the format strings for sprintf_s and sscanf_s do not process similarly. dot in the format string for sscanf_s has no sense while in the format string of sprintf_s has meaning. since the format string for type double or float is only one for both presenting the value or evaluating it, i've to replace the class with another one which i alter by code rounding it and this is what exactly i wanted to avoid. 2. it's the same for a spin ctrl. instead of calling EnableSpinControl for the property, i've to define another function to create another spin ctrl class with the desired functionality and this is also what i wanted to avoid. i wonder how such great class are coded with such fool limitations! thanx anyway

                    L J 2 Replies Last reply
                    0
                    • I ilostmyid2

                      all of the problem is that i like to least code, otherwise i would code another CSpinCtrl class as well as another CMFCPropertyGridProperty! 2. i've also to set steps of up and down arrows to 100 instead of increment and decrement. i prefer to use a different class than the original CSpinCtrl instead. 1. i tried to explain accurately! the problem is that the format strings for sprintf_s and sscanf_s do not process similarly. dot in the format string for sscanf_s has no sense while in the format string of sprintf_s has meaning. since the format string for type double or float is only one for both presenting the value or evaluating it, i've to replace the class with another one which i alter by code rounding it and this is what exactly i wanted to avoid. 2. it's the same for a spin ctrl. instead of calling EnableSpinControl for the property, i've to define another function to create another spin ctrl class with the desired functionality and this is also what i wanted to avoid. i wonder how such great class are coded with such fool limitations! thanx anyway

                      L Offline
                      L Offline
                      Lost User
                      wrote on last edited by
                      #10

                      ilostmyid2 wrote:

                      i wonder how such great class are coded with such fool limitations!

                      Sorry, no idea, perhaps you should direct your comments to Microsoft, as they are the ones responsible for it.

                      Just say 'NO' to evaluated arguments for diadic functions! Ash

                      I 1 Reply Last reply
                      0
                      • L Lost User

                        ilostmyid2 wrote:

                        i wonder how such great class are coded with such fool limitations!

                        Sorry, no idea, perhaps you should direct your comments to Microsoft, as they are the ones responsible for it.

                        Just say 'NO' to evaluated arguments for diadic functions! Ash

                        I Offline
                        I Offline
                        ilostmyid2
                        wrote on last edited by
                        #11

                        yeah, good idea, although i get my answers mostly from codeproject rather than MS! and u mean there's really no option other than replacing codes?

                        1 Reply Last reply
                        0
                        • I ilostmyid2

                          all of the problem is that i like to least code, otherwise i would code another CSpinCtrl class as well as another CMFCPropertyGridProperty! 2. i've also to set steps of up and down arrows to 100 instead of increment and decrement. i prefer to use a different class than the original CSpinCtrl instead. 1. i tried to explain accurately! the problem is that the format strings for sprintf_s and sscanf_s do not process similarly. dot in the format string for sscanf_s has no sense while in the format string of sprintf_s has meaning. since the format string for type double or float is only one for both presenting the value or evaluating it, i've to replace the class with another one which i alter by code rounding it and this is what exactly i wanted to avoid. 2. it's the same for a spin ctrl. instead of calling EnableSpinControl for the property, i've to define another function to create another spin ctrl class with the desired functionality and this is also what i wanted to avoid. i wonder how such great class are coded with such fool limitations! thanx anyway

                          J Offline
                          J Offline
                          jschell
                          wrote on last edited by
                          #12

                          ilostmyid2 wrote:

                          i wonder how such great class are coded with such fool limitations!

                          The origins are from C or even earlier. And myself I don't see the problem. First since the methods do not in fact do the same thing it isn't surprising that they use different idioms. Second the point of scanf is to read/parse data. And the solution you were given seems to me to do exactly that. Could you explain what exactly it isn't doing that you want it to do in terms of reading/parsing data?

                          1 Reply Last reply
                          0
                          • I ilostmyid2

                            thank u for the description. the problem is that format strings for sprintf_s and sscanf_s differ. for sscanf_s including a . in format causes Invalid Input Format exception in anyway. as u mentioned, the input string is read by the number of bytes specified in the format b4 f and the chunk string is processed to be converted into a float. while in sprintf_s . has meaning. %4.2f for example means that the output string must contain at least 4 characters and exactly 2 digits after decimal point. if it be needed this may increase, eg. %2.2f or even %1.2f lead to the same output 0.02 or even 123456789.00. this is while we has only one format for a grid ctrl, not two separate formats, one for sprintf_s and one for sscanf_s. as i said b4 it's stored in CMFCPropertyGridProperty::m_strFormatFloat or CMFCPropertyGridProperty::m_strFormatDouble. this uniqueness in the source of the problem. now what's ur suggestion? i've also another problem. spin ctrls are designated for integral fields. i need to attach a spin ctrl to a field of type float. for example when i've 12.34 in the field it may get 11.34 or 13.34 with up and down arrows. if i specify it to limit to 20, after 19.34 it gets 20.00 with arrow up. when i specify low limit of zero it gets 0.00 after 0.34 with arrow down. the spin ctrl doesn't expect the input field to be a float while it doesn't contrast with its behavior. so the summary of the two problems are: 1. how can i overcome the uniqueness of floating point fields format in a grid ctrl which is both used for showing and inputting? 2. how can i have a spin ctrl for a floating point input field? thx

                            I Offline
                            I Offline
                            ilostmyid2
                            wrote on last edited by
                            #13

                            1. i found the way. indeed, the default implementations of converting text into value which is done in the virtual function TextToVar of a CMFCPropertyGridProperty and converting value into text which is done in the virtual function FormatProperty use m_strFormatFloat for float types and m_strFormatDouble for double types and we may override this behavior. so it's enough to leave m_strFormatFloat as is and override method FormatProperty in a derived class.

                            1 Reply Last reply
                            0
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            • Login

                            • Don't have an account? Register

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • World
                            • Users
                            • Groups