C Primer Plus - Chapter 4 - Task 6 (string output)












2














Task



Write a Program that requests the user's first name and then the user's last name. Have it print the entered names on one line and the number of letters in each name on the following line. Align each letter count with the end of the corresponding name, as in the following:



Klaus Dieter
5 6


My Try



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

void printWhitespace(int times) {
for (int i = 0; i < times; i++) {
printf(" ");
}
}

int main(void) {
// get names
printf("first name: ");
char firstName[20];
scanf("%s", &firstName);
printf("last name: ");
char lastName[20];
scanf("%s", &lastName);

// display names
printf("%s %sn", firstName, lastName);

// display number of characters under last character of names
int numOfWhitespace = strlen(firstName) - 1;
printWhitespace(numOfWhitespace);
printf("%d ", strlen(firstName));

numOfWhitespace = strlen(lastName) - 1;
printWhitespace(numOfWhitespace);
printf("%dn", strlen(lastName));
}


Does the author expect that from me? Or is there a better way to write that?










share|improve this question









New contributor




Vengeancos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

























    2














    Task



    Write a Program that requests the user's first name and then the user's last name. Have it print the entered names on one line and the number of letters in each name on the following line. Align each letter count with the end of the corresponding name, as in the following:



    Klaus Dieter
    5 6


    My Try



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

    void printWhitespace(int times) {
    for (int i = 0; i < times; i++) {
    printf(" ");
    }
    }

    int main(void) {
    // get names
    printf("first name: ");
    char firstName[20];
    scanf("%s", &firstName);
    printf("last name: ");
    char lastName[20];
    scanf("%s", &lastName);

    // display names
    printf("%s %sn", firstName, lastName);

    // display number of characters under last character of names
    int numOfWhitespace = strlen(firstName) - 1;
    printWhitespace(numOfWhitespace);
    printf("%d ", strlen(firstName));

    numOfWhitespace = strlen(lastName) - 1;
    printWhitespace(numOfWhitespace);
    printf("%dn", strlen(lastName));
    }


    Does the author expect that from me? Or is there a better way to write that?










    share|improve this question









    New contributor




    Vengeancos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.























      2












      2








      2







      Task



      Write a Program that requests the user's first name and then the user's last name. Have it print the entered names on one line and the number of letters in each name on the following line. Align each letter count with the end of the corresponding name, as in the following:



      Klaus Dieter
      5 6


      My Try



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

      void printWhitespace(int times) {
      for (int i = 0; i < times; i++) {
      printf(" ");
      }
      }

      int main(void) {
      // get names
      printf("first name: ");
      char firstName[20];
      scanf("%s", &firstName);
      printf("last name: ");
      char lastName[20];
      scanf("%s", &lastName);

      // display names
      printf("%s %sn", firstName, lastName);

      // display number of characters under last character of names
      int numOfWhitespace = strlen(firstName) - 1;
      printWhitespace(numOfWhitespace);
      printf("%d ", strlen(firstName));

      numOfWhitespace = strlen(lastName) - 1;
      printWhitespace(numOfWhitespace);
      printf("%dn", strlen(lastName));
      }


      Does the author expect that from me? Or is there a better way to write that?










      share|improve this question









      New contributor




      Vengeancos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      Task



      Write a Program that requests the user's first name and then the user's last name. Have it print the entered names on one line and the number of letters in each name on the following line. Align each letter count with the end of the corresponding name, as in the following:



      Klaus Dieter
      5 6


      My Try



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

      void printWhitespace(int times) {
      for (int i = 0; i < times; i++) {
      printf(" ");
      }
      }

      int main(void) {
      // get names
      printf("first name: ");
      char firstName[20];
      scanf("%s", &firstName);
      printf("last name: ");
      char lastName[20];
      scanf("%s", &lastName);

      // display names
      printf("%s %sn", firstName, lastName);

      // display number of characters under last character of names
      int numOfWhitespace = strlen(firstName) - 1;
      printWhitespace(numOfWhitespace);
      printf("%d ", strlen(firstName));

      numOfWhitespace = strlen(lastName) - 1;
      printWhitespace(numOfWhitespace);
      printf("%dn", strlen(lastName));
      }


      Does the author expect that from me? Or is there a better way to write that?







      c strings






      share|improve this question









      New contributor




      Vengeancos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question









      New contributor




      Vengeancos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question








      edited 30 mins ago









      Reinderien

      3,309720




      3,309720






      New contributor




      Vengeancos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 3 hours ago









      Vengeancos

      161




      161




      New contributor




      Vengeancos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      Vengeancos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      Vengeancos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






















          1 Answer
          1






          active

          oldest

          votes


















          2














          Small sugggestion for printWhitespace(). You could do the following:



          void printWhitespace(const unsigned int times) {
          printf("%*s", times, " ");
          }


          I have made the function argument const as it probably isn't meant to be modified. it is generally a good idea to be as "const" as possible as this avoids the mistake of writing to a variable that should be read-only.





          I would put the array declarations at the top of the function before any of the code with a blank line between the declarations and the first line of code.





          The function scanf can be used with caution... it can lead to buffer overflow attacks in the way it is used in your code. If the user enters a string longer than 19 characters (last character would be filled in as a null terminator in the buffer), scanf will just write on past the end of the buffer.



          You could help guard against this by using scanf("%20s", &firstName); and scanf("%20s", &lastName);



          Looked into this a little more and this SO answer, the author says:




          Note that the POSIX 2008 (2013) version of the scanf() family of
          functions supports a format modifier m (an assignment-allocation
          character) for string inputs (%s, %c, %[). Instead of taking a char *
          argument, it takes a char ** argument, and it allocates the necessary
          space for the value it reads




          That would be a useful way of avoiding buffer overflow, but you must remember to free() the buffer returned.





          The variable numOfWhitespace can also be const. Might put that to top of function too.





          Your last bit of code that tries to align the numbers to the end of the words will only align properly if the string length is 9 or less. If the string length is greater then the number will be double digits so you could account for this.





          Add return 0; to the end of the function. You reach the end of a non-void function without returning anything...





          Hope that helps :)






          share|improve this answer










          New contributor




          Jimbo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.


















          • I disagree with your const suggestion. Have a read through this answer - softwareengineering.stackexchange.com/a/204720 - with which I agree on most points. const is not useful on arguments unless the arguments are referential.
            – Reinderien
            23 mins ago












          • As of C99, return 0; in main is optional, compare stackoverflow.com/q/4138649/1187415.
            – Martin R
            7 mins ago











          Your Answer





          StackExchange.ifUsing("editor", function () {
          return StackExchange.using("mathjaxEditing", function () {
          StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
          StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
          });
          });
          }, "mathjax-editing");

          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "196"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });






          Vengeancos is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210632%2fc-primer-plus-chapter-4-task-6-string-output%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          2














          Small sugggestion for printWhitespace(). You could do the following:



          void printWhitespace(const unsigned int times) {
          printf("%*s", times, " ");
          }


          I have made the function argument const as it probably isn't meant to be modified. it is generally a good idea to be as "const" as possible as this avoids the mistake of writing to a variable that should be read-only.





          I would put the array declarations at the top of the function before any of the code with a blank line between the declarations and the first line of code.





          The function scanf can be used with caution... it can lead to buffer overflow attacks in the way it is used in your code. If the user enters a string longer than 19 characters (last character would be filled in as a null terminator in the buffer), scanf will just write on past the end of the buffer.



          You could help guard against this by using scanf("%20s", &firstName); and scanf("%20s", &lastName);



          Looked into this a little more and this SO answer, the author says:




          Note that the POSIX 2008 (2013) version of the scanf() family of
          functions supports a format modifier m (an assignment-allocation
          character) for string inputs (%s, %c, %[). Instead of taking a char *
          argument, it takes a char ** argument, and it allocates the necessary
          space for the value it reads




          That would be a useful way of avoiding buffer overflow, but you must remember to free() the buffer returned.





          The variable numOfWhitespace can also be const. Might put that to top of function too.





          Your last bit of code that tries to align the numbers to the end of the words will only align properly if the string length is 9 or less. If the string length is greater then the number will be double digits so you could account for this.





          Add return 0; to the end of the function. You reach the end of a non-void function without returning anything...





          Hope that helps :)






          share|improve this answer










          New contributor




          Jimbo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.


















          • I disagree with your const suggestion. Have a read through this answer - softwareengineering.stackexchange.com/a/204720 - with which I agree on most points. const is not useful on arguments unless the arguments are referential.
            – Reinderien
            23 mins ago












          • As of C99, return 0; in main is optional, compare stackoverflow.com/q/4138649/1187415.
            – Martin R
            7 mins ago
















          2














          Small sugggestion for printWhitespace(). You could do the following:



          void printWhitespace(const unsigned int times) {
          printf("%*s", times, " ");
          }


          I have made the function argument const as it probably isn't meant to be modified. it is generally a good idea to be as "const" as possible as this avoids the mistake of writing to a variable that should be read-only.





          I would put the array declarations at the top of the function before any of the code with a blank line between the declarations and the first line of code.





          The function scanf can be used with caution... it can lead to buffer overflow attacks in the way it is used in your code. If the user enters a string longer than 19 characters (last character would be filled in as a null terminator in the buffer), scanf will just write on past the end of the buffer.



          You could help guard against this by using scanf("%20s", &firstName); and scanf("%20s", &lastName);



          Looked into this a little more and this SO answer, the author says:




          Note that the POSIX 2008 (2013) version of the scanf() family of
          functions supports a format modifier m (an assignment-allocation
          character) for string inputs (%s, %c, %[). Instead of taking a char *
          argument, it takes a char ** argument, and it allocates the necessary
          space for the value it reads




          That would be a useful way of avoiding buffer overflow, but you must remember to free() the buffer returned.





          The variable numOfWhitespace can also be const. Might put that to top of function too.





          Your last bit of code that tries to align the numbers to the end of the words will only align properly if the string length is 9 or less. If the string length is greater then the number will be double digits so you could account for this.





          Add return 0; to the end of the function. You reach the end of a non-void function without returning anything...





          Hope that helps :)






          share|improve this answer










          New contributor




          Jimbo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.


















          • I disagree with your const suggestion. Have a read through this answer - softwareengineering.stackexchange.com/a/204720 - with which I agree on most points. const is not useful on arguments unless the arguments are referential.
            – Reinderien
            23 mins ago












          • As of C99, return 0; in main is optional, compare stackoverflow.com/q/4138649/1187415.
            – Martin R
            7 mins ago














          2












          2








          2






          Small sugggestion for printWhitespace(). You could do the following:



          void printWhitespace(const unsigned int times) {
          printf("%*s", times, " ");
          }


          I have made the function argument const as it probably isn't meant to be modified. it is generally a good idea to be as "const" as possible as this avoids the mistake of writing to a variable that should be read-only.





          I would put the array declarations at the top of the function before any of the code with a blank line between the declarations and the first line of code.





          The function scanf can be used with caution... it can lead to buffer overflow attacks in the way it is used in your code. If the user enters a string longer than 19 characters (last character would be filled in as a null terminator in the buffer), scanf will just write on past the end of the buffer.



          You could help guard against this by using scanf("%20s", &firstName); and scanf("%20s", &lastName);



          Looked into this a little more and this SO answer, the author says:




          Note that the POSIX 2008 (2013) version of the scanf() family of
          functions supports a format modifier m (an assignment-allocation
          character) for string inputs (%s, %c, %[). Instead of taking a char *
          argument, it takes a char ** argument, and it allocates the necessary
          space for the value it reads




          That would be a useful way of avoiding buffer overflow, but you must remember to free() the buffer returned.





          The variable numOfWhitespace can also be const. Might put that to top of function too.





          Your last bit of code that tries to align the numbers to the end of the words will only align properly if the string length is 9 or less. If the string length is greater then the number will be double digits so you could account for this.





          Add return 0; to the end of the function. You reach the end of a non-void function without returning anything...





          Hope that helps :)






          share|improve this answer










          New contributor




          Jimbo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.









          Small sugggestion for printWhitespace(). You could do the following:



          void printWhitespace(const unsigned int times) {
          printf("%*s", times, " ");
          }


          I have made the function argument const as it probably isn't meant to be modified. it is generally a good idea to be as "const" as possible as this avoids the mistake of writing to a variable that should be read-only.





          I would put the array declarations at the top of the function before any of the code with a blank line between the declarations and the first line of code.





          The function scanf can be used with caution... it can lead to buffer overflow attacks in the way it is used in your code. If the user enters a string longer than 19 characters (last character would be filled in as a null terminator in the buffer), scanf will just write on past the end of the buffer.



          You could help guard against this by using scanf("%20s", &firstName); and scanf("%20s", &lastName);



          Looked into this a little more and this SO answer, the author says:




          Note that the POSIX 2008 (2013) version of the scanf() family of
          functions supports a format modifier m (an assignment-allocation
          character) for string inputs (%s, %c, %[). Instead of taking a char *
          argument, it takes a char ** argument, and it allocates the necessary
          space for the value it reads




          That would be a useful way of avoiding buffer overflow, but you must remember to free() the buffer returned.





          The variable numOfWhitespace can also be const. Might put that to top of function too.





          Your last bit of code that tries to align the numbers to the end of the words will only align properly if the string length is 9 or less. If the string length is greater then the number will be double digits so you could account for this.





          Add return 0; to the end of the function. You reach the end of a non-void function without returning anything...





          Hope that helps :)







          share|improve this answer










          New contributor




          Jimbo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.









          share|improve this answer



          share|improve this answer








          edited 2 hours ago





















          New contributor




          Jimbo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.









          answered 2 hours ago









          Jimbo

          1213




          1213




          New contributor




          Jimbo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.





          New contributor





          Jimbo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.






          Jimbo is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.












          • I disagree with your const suggestion. Have a read through this answer - softwareengineering.stackexchange.com/a/204720 - with which I agree on most points. const is not useful on arguments unless the arguments are referential.
            – Reinderien
            23 mins ago












          • As of C99, return 0; in main is optional, compare stackoverflow.com/q/4138649/1187415.
            – Martin R
            7 mins ago


















          • I disagree with your const suggestion. Have a read through this answer - softwareengineering.stackexchange.com/a/204720 - with which I agree on most points. const is not useful on arguments unless the arguments are referential.
            – Reinderien
            23 mins ago












          • As of C99, return 0; in main is optional, compare stackoverflow.com/q/4138649/1187415.
            – Martin R
            7 mins ago
















          I disagree with your const suggestion. Have a read through this answer - softwareengineering.stackexchange.com/a/204720 - with which I agree on most points. const is not useful on arguments unless the arguments are referential.
          – Reinderien
          23 mins ago






          I disagree with your const suggestion. Have a read through this answer - softwareengineering.stackexchange.com/a/204720 - with which I agree on most points. const is not useful on arguments unless the arguments are referential.
          – Reinderien
          23 mins ago














          As of C99, return 0; in main is optional, compare stackoverflow.com/q/4138649/1187415.
          – Martin R
          7 mins ago




          As of C99, return 0; in main is optional, compare stackoverflow.com/q/4138649/1187415.
          – Martin R
          7 mins ago










          Vengeancos is a new contributor. Be nice, and check out our Code of Conduct.










          draft saved

          draft discarded


















          Vengeancos is a new contributor. Be nice, and check out our Code of Conduct.













          Vengeancos is a new contributor. Be nice, and check out our Code of Conduct.












          Vengeancos is a new contributor. Be nice, and check out our Code of Conduct.
















          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.





          Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


          Please pay close attention to the following guidance:


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f210632%2fc-primer-plus-chapter-4-task-6-string-output%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Plaza Victoria

          In PowerPoint, is there a keyboard shortcut for bulleted / numbered list?

          How to put 3 figures in Latex with 2 figures side by side and 1 below these side by side images but in...