How to put strings from a file into an array in c












-1















So I have this code:



char inte[10];
while(j<noinput) {
fscanf(circuit,"%s",inte);
vararray[count]=inte;
count++;
j++;
}


However when I print the contents of the array like this:



for (h=0;h<noinput+2;h++){
printf("%dth variable: %sn",h,vararray[h]);
}


The elements past the first two (which are reserved for special elements) are all equal to the LAST string that I had taken in from fscanf earlier. I have no idea how one of the strings from fscanf could be equal to multiple slots in the array when I am only setting



vararray[count]=inte;


Shouldn't this mean that each element of the array will be different since I am incrementing count every time? I am so confused. I also tried doing:



 fscanf(circuit,"%s",vararray[count]);


But this also did not work and gave me null elements for certain indexes.










share|improve this question























  • Are all strings in the file of the same length?

    – Susmit Agrawal
    Nov 23 '18 at 18:25






  • 1





    Without the file content being provided as well the question cannot be answered. Please provide the input data you tried the code with.

    – Géza Török
    Nov 23 '18 at 18:25











  • I simply tested it on a file containing "a b c"

    – madmax007
    Nov 23 '18 at 18:30











  • Please provide the whole code.

    – Susmit Agrawal
    Nov 23 '18 at 18:32











  • The whole code isn't needed; whilst this isn't a Minimal, Complete, and Verifiable example, it's pretty close. But, @madmax007, your vararray declaration would be useful.

    – wizzwizz4
    Nov 23 '18 at 18:37
















-1















So I have this code:



char inte[10];
while(j<noinput) {
fscanf(circuit,"%s",inte);
vararray[count]=inte;
count++;
j++;
}


However when I print the contents of the array like this:



for (h=0;h<noinput+2;h++){
printf("%dth variable: %sn",h,vararray[h]);
}


The elements past the first two (which are reserved for special elements) are all equal to the LAST string that I had taken in from fscanf earlier. I have no idea how one of the strings from fscanf could be equal to multiple slots in the array when I am only setting



vararray[count]=inte;


Shouldn't this mean that each element of the array will be different since I am incrementing count every time? I am so confused. I also tried doing:



 fscanf(circuit,"%s",vararray[count]);


But this also did not work and gave me null elements for certain indexes.










share|improve this question























  • Are all strings in the file of the same length?

    – Susmit Agrawal
    Nov 23 '18 at 18:25






  • 1





    Without the file content being provided as well the question cannot be answered. Please provide the input data you tried the code with.

    – Géza Török
    Nov 23 '18 at 18:25











  • I simply tested it on a file containing "a b c"

    – madmax007
    Nov 23 '18 at 18:30











  • Please provide the whole code.

    – Susmit Agrawal
    Nov 23 '18 at 18:32











  • The whole code isn't needed; whilst this isn't a Minimal, Complete, and Verifiable example, it's pretty close. But, @madmax007, your vararray declaration would be useful.

    – wizzwizz4
    Nov 23 '18 at 18:37














-1












-1








-1








So I have this code:



char inte[10];
while(j<noinput) {
fscanf(circuit,"%s",inte);
vararray[count]=inte;
count++;
j++;
}


However when I print the contents of the array like this:



for (h=0;h<noinput+2;h++){
printf("%dth variable: %sn",h,vararray[h]);
}


The elements past the first two (which are reserved for special elements) are all equal to the LAST string that I had taken in from fscanf earlier. I have no idea how one of the strings from fscanf could be equal to multiple slots in the array when I am only setting



vararray[count]=inte;


Shouldn't this mean that each element of the array will be different since I am incrementing count every time? I am so confused. I also tried doing:



 fscanf(circuit,"%s",vararray[count]);


But this also did not work and gave me null elements for certain indexes.










share|improve this question














So I have this code:



char inte[10];
while(j<noinput) {
fscanf(circuit,"%s",inte);
vararray[count]=inte;
count++;
j++;
}


However when I print the contents of the array like this:



for (h=0;h<noinput+2;h++){
printf("%dth variable: %sn",h,vararray[h]);
}


The elements past the first two (which are reserved for special elements) are all equal to the LAST string that I had taken in from fscanf earlier. I have no idea how one of the strings from fscanf could be equal to multiple slots in the array when I am only setting



vararray[count]=inte;


Shouldn't this mean that each element of the array will be different since I am incrementing count every time? I am so confused. I also tried doing:



 fscanf(circuit,"%s",vararray[count]);


But this also did not work and gave me null elements for certain indexes.







c arrays string






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 23 '18 at 18:18









madmax007madmax007

13




13













  • Are all strings in the file of the same length?

    – Susmit Agrawal
    Nov 23 '18 at 18:25






  • 1





    Without the file content being provided as well the question cannot be answered. Please provide the input data you tried the code with.

    – Géza Török
    Nov 23 '18 at 18:25











  • I simply tested it on a file containing "a b c"

    – madmax007
    Nov 23 '18 at 18:30











  • Please provide the whole code.

    – Susmit Agrawal
    Nov 23 '18 at 18:32











  • The whole code isn't needed; whilst this isn't a Minimal, Complete, and Verifiable example, it's pretty close. But, @madmax007, your vararray declaration would be useful.

    – wizzwizz4
    Nov 23 '18 at 18:37



















  • Are all strings in the file of the same length?

    – Susmit Agrawal
    Nov 23 '18 at 18:25






  • 1





    Without the file content being provided as well the question cannot be answered. Please provide the input data you tried the code with.

    – Géza Török
    Nov 23 '18 at 18:25











  • I simply tested it on a file containing "a b c"

    – madmax007
    Nov 23 '18 at 18:30











  • Please provide the whole code.

    – Susmit Agrawal
    Nov 23 '18 at 18:32











  • The whole code isn't needed; whilst this isn't a Minimal, Complete, and Verifiable example, it's pretty close. But, @madmax007, your vararray declaration would be useful.

    – wizzwizz4
    Nov 23 '18 at 18:37

















Are all strings in the file of the same length?

– Susmit Agrawal
Nov 23 '18 at 18:25





Are all strings in the file of the same length?

– Susmit Agrawal
Nov 23 '18 at 18:25




1




1





Without the file content being provided as well the question cannot be answered. Please provide the input data you tried the code with.

– Géza Török
Nov 23 '18 at 18:25





Without the file content being provided as well the question cannot be answered. Please provide the input data you tried the code with.

– Géza Török
Nov 23 '18 at 18:25













I simply tested it on a file containing "a b c"

– madmax007
Nov 23 '18 at 18:30





I simply tested it on a file containing "a b c"

– madmax007
Nov 23 '18 at 18:30













Please provide the whole code.

– Susmit Agrawal
Nov 23 '18 at 18:32





Please provide the whole code.

– Susmit Agrawal
Nov 23 '18 at 18:32













The whole code isn't needed; whilst this isn't a Minimal, Complete, and Verifiable example, it's pretty close. But, @madmax007, your vararray declaration would be useful.

– wizzwizz4
Nov 23 '18 at 18:37





The whole code isn't needed; whilst this isn't a Minimal, Complete, and Verifiable example, it's pretty close. But, @madmax007, your vararray declaration would be useful.

– wizzwizz4
Nov 23 '18 at 18:37












2 Answers
2






active

oldest

votes


















0














you are doing something too wrong. By "vararray[count]=inte;" you are doing pointer assignment so all of your vararray is getting filled by same string. I am guessing you are new to C so I will answer due to that. Correct way would look something like below



Fixed size solution:



char vararray[ROWCOUNT][BUFFERSIZE];
for(count=0; j<noinput; ++count, ++j) {
fscanf(circuit,"%s",(char*)vararray[count]);
}


With dynamic memory management



char * vararray[ROWCOUNT];
for(count=0; j<noinput; ++count, ++j) {
vararray[count] = (char*)malloc(BUFSIZE);
fscanf(circuit,"%s", vararray[count]);
}


I want to warn you in the way of becoming an expert on C nowadays is somewhat madness , i mean unless you have another choice. Examples below I put and the thing you wrote are completely unsafe and unsecure...






share|improve this answer































    0














    You're not copying the string. Here's what's happening:



    char *vararray[462]; // declare an array of string pointers
    char inte[10]; // declare a char array (to function as a string)

    for (int i = 0; i < 462; i += 1) {
    // do something
    vararray[i] = inte;
    }


    This is causing all of the items of vararray to point to the memory also referred to as inte... but you're overwriting that each time! Instead, do something like this:



    #include <string.h>  // write me at the top, outside main()!

    char vararray[462][10]; // declare an array of strings (max length 9)
    char inte[10]; // declare a char array (to function as a string)

    for (int i = 0; i < 462; i += 1) {
    fscanf(circuit,"%10s",inte); // use buffer size to make xscanf safer
    strncpy(vararray[i], inte, 9); // copy inte, making sure not to buffer overflow!
    vararray[i][9] = ''; // if inte is too big, a null byte won't be added to the end of the string; make sure that it's there
    }


    This copies the string! Your problem should go away when you do this.






    share|improve this answer

























      Your Answer






      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: "1"
      };
      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: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      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
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53451388%2fhow-to-put-strings-from-a-file-into-an-array-in-c%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      0














      you are doing something too wrong. By "vararray[count]=inte;" you are doing pointer assignment so all of your vararray is getting filled by same string. I am guessing you are new to C so I will answer due to that. Correct way would look something like below



      Fixed size solution:



      char vararray[ROWCOUNT][BUFFERSIZE];
      for(count=0; j<noinput; ++count, ++j) {
      fscanf(circuit,"%s",(char*)vararray[count]);
      }


      With dynamic memory management



      char * vararray[ROWCOUNT];
      for(count=0; j<noinput; ++count, ++j) {
      vararray[count] = (char*)malloc(BUFSIZE);
      fscanf(circuit,"%s", vararray[count]);
      }


      I want to warn you in the way of becoming an expert on C nowadays is somewhat madness , i mean unless you have another choice. Examples below I put and the thing you wrote are completely unsafe and unsecure...






      share|improve this answer




























        0














        you are doing something too wrong. By "vararray[count]=inte;" you are doing pointer assignment so all of your vararray is getting filled by same string. I am guessing you are new to C so I will answer due to that. Correct way would look something like below



        Fixed size solution:



        char vararray[ROWCOUNT][BUFFERSIZE];
        for(count=0; j<noinput; ++count, ++j) {
        fscanf(circuit,"%s",(char*)vararray[count]);
        }


        With dynamic memory management



        char * vararray[ROWCOUNT];
        for(count=0; j<noinput; ++count, ++j) {
        vararray[count] = (char*)malloc(BUFSIZE);
        fscanf(circuit,"%s", vararray[count]);
        }


        I want to warn you in the way of becoming an expert on C nowadays is somewhat madness , i mean unless you have another choice. Examples below I put and the thing you wrote are completely unsafe and unsecure...






        share|improve this answer


























          0












          0








          0







          you are doing something too wrong. By "vararray[count]=inte;" you are doing pointer assignment so all of your vararray is getting filled by same string. I am guessing you are new to C so I will answer due to that. Correct way would look something like below



          Fixed size solution:



          char vararray[ROWCOUNT][BUFFERSIZE];
          for(count=0; j<noinput; ++count, ++j) {
          fscanf(circuit,"%s",(char*)vararray[count]);
          }


          With dynamic memory management



          char * vararray[ROWCOUNT];
          for(count=0; j<noinput; ++count, ++j) {
          vararray[count] = (char*)malloc(BUFSIZE);
          fscanf(circuit,"%s", vararray[count]);
          }


          I want to warn you in the way of becoming an expert on C nowadays is somewhat madness , i mean unless you have another choice. Examples below I put and the thing you wrote are completely unsafe and unsecure...






          share|improve this answer













          you are doing something too wrong. By "vararray[count]=inte;" you are doing pointer assignment so all of your vararray is getting filled by same string. I am guessing you are new to C so I will answer due to that. Correct way would look something like below



          Fixed size solution:



          char vararray[ROWCOUNT][BUFFERSIZE];
          for(count=0; j<noinput; ++count, ++j) {
          fscanf(circuit,"%s",(char*)vararray[count]);
          }


          With dynamic memory management



          char * vararray[ROWCOUNT];
          for(count=0; j<noinput; ++count, ++j) {
          vararray[count] = (char*)malloc(BUFSIZE);
          fscanf(circuit,"%s", vararray[count]);
          }


          I want to warn you in the way of becoming an expert on C nowadays is somewhat madness , i mean unless you have another choice. Examples below I put and the thing you wrote are completely unsafe and unsecure...







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 23 '18 at 18:43









          AbdurrahimAbdurrahim

          1,046911




          1,046911

























              0














              You're not copying the string. Here's what's happening:



              char *vararray[462]; // declare an array of string pointers
              char inte[10]; // declare a char array (to function as a string)

              for (int i = 0; i < 462; i += 1) {
              // do something
              vararray[i] = inte;
              }


              This is causing all of the items of vararray to point to the memory also referred to as inte... but you're overwriting that each time! Instead, do something like this:



              #include <string.h>  // write me at the top, outside main()!

              char vararray[462][10]; // declare an array of strings (max length 9)
              char inte[10]; // declare a char array (to function as a string)

              for (int i = 0; i < 462; i += 1) {
              fscanf(circuit,"%10s",inte); // use buffer size to make xscanf safer
              strncpy(vararray[i], inte, 9); // copy inte, making sure not to buffer overflow!
              vararray[i][9] = ''; // if inte is too big, a null byte won't be added to the end of the string; make sure that it's there
              }


              This copies the string! Your problem should go away when you do this.






              share|improve this answer






























                0














                You're not copying the string. Here's what's happening:



                char *vararray[462]; // declare an array of string pointers
                char inte[10]; // declare a char array (to function as a string)

                for (int i = 0; i < 462; i += 1) {
                // do something
                vararray[i] = inte;
                }


                This is causing all of the items of vararray to point to the memory also referred to as inte... but you're overwriting that each time! Instead, do something like this:



                #include <string.h>  // write me at the top, outside main()!

                char vararray[462][10]; // declare an array of strings (max length 9)
                char inte[10]; // declare a char array (to function as a string)

                for (int i = 0; i < 462; i += 1) {
                fscanf(circuit,"%10s",inte); // use buffer size to make xscanf safer
                strncpy(vararray[i], inte, 9); // copy inte, making sure not to buffer overflow!
                vararray[i][9] = ''; // if inte is too big, a null byte won't be added to the end of the string; make sure that it's there
                }


                This copies the string! Your problem should go away when you do this.






                share|improve this answer




























                  0












                  0








                  0







                  You're not copying the string. Here's what's happening:



                  char *vararray[462]; // declare an array of string pointers
                  char inte[10]; // declare a char array (to function as a string)

                  for (int i = 0; i < 462; i += 1) {
                  // do something
                  vararray[i] = inte;
                  }


                  This is causing all of the items of vararray to point to the memory also referred to as inte... but you're overwriting that each time! Instead, do something like this:



                  #include <string.h>  // write me at the top, outside main()!

                  char vararray[462][10]; // declare an array of strings (max length 9)
                  char inte[10]; // declare a char array (to function as a string)

                  for (int i = 0; i < 462; i += 1) {
                  fscanf(circuit,"%10s",inte); // use buffer size to make xscanf safer
                  strncpy(vararray[i], inte, 9); // copy inte, making sure not to buffer overflow!
                  vararray[i][9] = ''; // if inte is too big, a null byte won't be added to the end of the string; make sure that it's there
                  }


                  This copies the string! Your problem should go away when you do this.






                  share|improve this answer















                  You're not copying the string. Here's what's happening:



                  char *vararray[462]; // declare an array of string pointers
                  char inte[10]; // declare a char array (to function as a string)

                  for (int i = 0; i < 462; i += 1) {
                  // do something
                  vararray[i] = inte;
                  }


                  This is causing all of the items of vararray to point to the memory also referred to as inte... but you're overwriting that each time! Instead, do something like this:



                  #include <string.h>  // write me at the top, outside main()!

                  char vararray[462][10]; // declare an array of strings (max length 9)
                  char inte[10]; // declare a char array (to function as a string)

                  for (int i = 0; i < 462; i += 1) {
                  fscanf(circuit,"%10s",inte); // use buffer size to make xscanf safer
                  strncpy(vararray[i], inte, 9); // copy inte, making sure not to buffer overflow!
                  vararray[i][9] = ''; // if inte is too big, a null byte won't be added to the end of the string; make sure that it's there
                  }


                  This copies the string! Your problem should go away when you do this.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 23 '18 at 19:09

























                  answered Nov 23 '18 at 18:35









                  wizzwizz4wizzwizz4

                  3,53511635




                  3,53511635






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • 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%2fstackoverflow.com%2fquestions%2f53451388%2fhow-to-put-strings-from-a-file-into-an-array-in-c%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

                      Ottavio Pratesi

                      Tricia Helfer

                      15 giugno