2

I'm having a tough time figuring out how to get this structure array to appear as a single string "c_str" when I use the printf function. As of now I only can only get c_str to be one part of the line structure array, in this case the 24th line. When I use print(c_str); i would like the output to display all of the data that is in the code. It needs to be stored as a string because I have a function that needs to access n,m,gnm,hnm,dgnm, and dhnm.

Thank you for the help

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

int main()
{ 
int i=0,n[90],m[90];
float gnm[90],hnm[90],dgnm[90],dhnm[90];
static char c_str[90];

      struct wmm
   {
    int   n;
    int   m;
    float gnm;
    float hnm;
    float dgnm;
    float dhnm;
   }  book[90]= {{1, 0,  -29496.6,       0.0,       11.6,       0.0},
  {1, 1,   -1586.3,    4944.4,       16.5,     -25.9},
  {2, 0,   -2396.6,       0.0,      -12.1,       0.0},
  {2, 1,    3026.1,   -2707.7,       -4.4,     -22.5},
  {2, 2,    1668.6,    -576.1,        1.9,     -11.8},
  {3, 0,    1340.1,       0.0,        0.4,       0.0},
  {3, 1,   -2326.2,    -160.2,       -4.1,       7.3},
  {3, 2,    1231.9,     251.9,       -2.9,      -3.9},
  {3, 3,    634.0,     -536.6,       -7.7,      -2.6},
  {4, 0,    912.6,        0.0,       -1.8,       0.0},
  {4, 1,    808.9,      286.4,        2.3,       1.1},
  {4, 2,    166.7,     -211.2,       -8.7,       2.7},
  {4, 3,   -357.1,      164.3,        4.6,       3.9},
  {4, 4,     89.4,     -309.1,       -2.1,      -0.8},
  {5, 0,   -230.9,        0.0,       -1.0,       0.0},
  {5, 1,    357.2,       44.6,        0.6,       0.4},
  {5, 2,    200.3,      188.9,       -1.8,       1.8},
  {5, 3,   -141.1,     -118.2,       -1.0,       1.2},
  {5, 4,   -163.0,        0.0,        0.9,       4.0},
  {5, 5,     -7.8,      100.9,        1.0,      -0.6},
  {6, 0,     72.8,        0.0,       -0.2,       0.0},
  {6, 1,     68.6,      -20.8,       -0.2,      -0.2},
  {6, 2,     76.0,       44.1,       -0.1,      -2.1},
  {6, 3,   -141.4,      61.5 ,        2.0,      -0.4},
  {6, 4,    -22.8,      -66.3,       -1.7,      -0.6},
  {6, 5,     13.2,        3.1,       -0.3,       0.5},
  {6, 6,    -77.9,       55.0,        1.7,       0.9},
  {7,  0,      80.5,       0.0,        0.1,        0.0},
  {7,  1,     -75.1,     -57.9,       -0.1,        0.7},
  {7,  2,      -4.7,     -21.1,       -0.6,        0.3},
  {7,  3,      45.3,       6.5,        1.3,       -0.1},
  {7,  4,      13.9,      24.9,        0.4,       -0.1},
  {7,  5,      10.4,       7.0,        0.3,       -0.8},
  {7,  6,       1.7,     -27.7,       -0.7,       -0.3},
  {7,  7,       4.9,      -3.3,        0.6,        0.3},
  {8,  0,      24.4,       0.0,       -0.1,        0.0},
  {8,  1,       8.1,      11.0,        0.1,       -0.1},
  {8,  2,     -14.5,     -20.0,       -0.6,        0.2},
  {8,  3,      -5.6,      11.9,        0.2,        0.4},
  {8,  4,     -19.3,     -17.4,       -0.2,        0.4},
  {8,  5,      11.5,      16.7,        0.3,        0.1},
  {8,  6,      10.9,       7.0,        0.3,       -0.1},
  {8,  7,     -14.1,     -10.8,       -0.6,        0.4},
  {8,  8,      -3.7,       1.7,        0.2,        0.3},
  {9,  0,       5.4,       0.0,        0.0,        0.0},
  {9,  1,       9.4,     -20.5,       -0.1,        0.0},
  {9,  2,       3.4,      11.5,        0.0,       -0.2},
  {9,  3,      -5.2,      12.8,        0.3,        0.0},
  {9,  4,       3.1,      -7.2,       -0.4,       -0.1},
  {9,  5,     -12.4,      -7.4,       -0.3,        0.1},
  {9,  6,      -0.7,       8.0,        0.1,        0.0},
  {9,  7,       8.4,       2.1,       -0.1,       -0.2},
  {9,  8,      -8.5,      -6.1,       -0.4,        0.3},
  {9,  9,     -10.1,       7.0,       -0.2,        0.2},
  {10,  0,      -2.0,       0.0,        0.0,        0.0},
  {10,  1,      -6.3,       2.8,        0.0,        0.1},
  {10, 2 ,      0.9 ,     -0.1 ,      -0.1 ,      -0.1},
  {10,  3,      -1.1,       4.7,        0.2,        0.0},
  {10,  4,      -0.2,       4.4,        0.0,       -0.1},
  {10,  5,       2.5,      -7.2,       -0.1,       -0.1},
  {10,  6,      -0.3,     -1.0 ,      -0.2 ,       0.0},
  {10,  7,       2.2,      -3.9,        0.0,       -0.1},
  {10,  8,       3.1,      -2.0,       -0.1,       -0.2},
  {10,  9,      -1.0,      -2.0,       -0.2,        0.0},
  {10, 10,      -2.8,      -8.3,       -0.2,       -0.1},
  {11,  0,       3.0,       0.0,        0.0,        0.0},
  {11,  1,      -1.5,       0.2,        0.0,        0.0},
  {11,  2,      -2.1,       1.7,        0.0,        0.1},
  {11,  3,       1.7,      -0.6,        0.1,        0.0},
  {11,  4,      -0.5,      -1.8,        0.0,        0.1},
  {11,  5,       0.5,       0.9,        0.0,        0.0},
  {11,  6,      -0.8,      -0.4,        0.0,        0.1},
  {11,  7,       0.4,      -2.5,        0.0,        0.0},
  {11,  8,       1.8,      -1.3,        0.0,       -0.1},
  {11,  9,       0.1,      -2.1,        0.0,       -0.1},
  {11, 10,       0.7,      -1.9,       -0.1,        0.0},
  {11, 11,       3.8,      -1.8,        0.0,       -0.1},
  {12,  0,      -2.2,       0.0,        0.0,        0.0},
  {12,  1,      -0.2,      -0.9,        0.0,        0.0},
  {12,  2,       0.3,       0.3,        0.1,        0.0},
  {12,  3,      1.0 ,      2.1 ,       0.1 ,       0.0},
  {12,  4,      -0.6,      -2.5,       -0.1,        0.0},
  {12,  5,       0.9,       0.5,        0.0,        0.0},
  {12,  6,      -0.1,       0.6,        0.0,        0.1},
  {12,  7,       0.5,       0.0,        0.0,        0.0},
  {12,  8,      -0.4,       0.1,        0.0,        0.0},
  {12,  9,      -0.4,       0.3,        0.0,        0.0},
  {12, 10,       0.2,      -0.9,        0.0,        0.0},
  {12, 11,      -0.8,      -0.2,       -0.1,        0.0},
  {12, 12,       0.0,       0.9,        0.1,        0.0}};


 sprintf(c_str, " %d %d %lf %lf %lf %lf" ,book[25].n, book[25].m , book[25].gnm , book[25].hnm, book[25].dgnm, book[25].dhnm); 

   getchar();
   return 0;

 }

1 Answer 1

2

If you are trying to copy all of the data in the struct into c_str, you only need to wrap sprintf() in a loop. Note that you should really switch to snprintf() to avoid accidentally introducing a buffer-overflow.

Since sprintf() and snprintf() return the number of character that they add to the string, you can easily keep track of the next unused location in the string:

int i, n = 90, buf_size = 90, offset = 0;
for (i = 0; i < n && offset < buf_size; ++i) {
     offset += snprintf(c_str + offset, buf_size - offset, " %d %d %lf %lf %lf %lf", book[i].n, book[i].m , book[i].gnm , book[i].hnm, book[i].dgnm, book[i].dhnm);
}

If you were to repeatedly pass c_str as the first argument, it would only contain the last line.

Sign up to request clarification or add additional context in comments.

5 Comments

It worked, thank you so much! I tried it before with just sprintf() and I got a buffer overflow so it seems that snprintf() did the trick. Thanks again!
@Oli: Good catch. I just edited my answer to fix that bug, @officerkrupke: Glad it works!
Oh, also, snprintf returns the number of characters that would have been written if truncation had not occurred. So you need to break out of your loop as soon as the return value exceeds buf_size-offset. Also, I don't think the NULL terminator gets written if the output is truncated.
when I try to run the code that is above, I only get a few of the data points stored in c_str. The first few and the last few. When I run it with just buf_size and not buf-size-offset c_str has the right values but that causes the program I'm running to freeze and display "bcast.exe has encountered a problem and needs to close. We are sorry for the inconvenience.."
I just fixed a minor bug in the loop condition, but buf_size - offset is definitely the correct argument. If you were to pass buf_size, snprintf() would be just as vulnerable to buffer overflows as the vanilla sprintf(). It sounds like the data is being truncated because of the small buffer size: the data in the array will likely use several KiB of memory when expanded to a string.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.