Just change this
for(i = 0; i < pascal_string->size; i++)
with
for(i = 0; (i < 11) && (stringC[i] != 0) ; i++)
since C strings are '\0'
terminated, you have to loop untill you find the terminating '\0'
or you are out of space.
You can also compute the length of the string like this
for (i = 0 ; stringC[i] != '\0' ; ++i)
pascal_string->size++;
and then keep the loop as it was
for(i = 0; i < pascal_string->size; i++)
there is another issue with your code, this is worng
pascal_string[i] = stringC[i];
you should store the characters in the string
member like this
pascal_string->string[i] = stringC[i];
Apparently you need this
#include <stdio.h>
#include <stdlib.h>
typedef struct PascalString {
int size;
char *string;
} PString;
PString *newPascalString(char *stringC) {
int i;
PString *pascal_string = malloc(sizeof(struct PascalString));
if (pascal_string == NULL) /* always check the return value of malloc */
return NULL;
pascal_string->size = 0;
for (i = 0; stringC[i] != '\0'; ++i)
++pascal_string->size;
pascal_string->string = malloc(pascal_string->size);
if (pascal_string->string == NULL) {
free(pascal_string);
return NULL;
}
for(i = 0; i < pascal_string->size; i++)
pascal_string->string[i] = stringC[i]; // here is my problem
return pascal_string;
}
int main()
{
char *c_string = "Mississippi";
PString *pascal_string;
pascal_string = newPascalString(c_string);
if (pascal_string != NULL) {
if (pascal_string->size == 11)
printf("the pascal string has length 11 excluding the terminating `'\\0'`.\n");
else
printf("the pascal string length is not 11.\n");
if (pascal_string->string != NULL) {
/* write to standard output exacly pascal_string->size characters */
/* printf will not work here, it needs `'\0'` at the end */
fwrite(pascal_string->string, 1, pascal_string->size, stdout);
printf("\n");
/* free pascal_string->string, allocated with
*
* pascal_string->string = malloc(pascal_string->size)
*/
free(pascal_string->string);
}
/* free pascal_string, allocated with
*
* pascal_string = malloc(sizeof(struct PascalString))
*/
free(pascal_string);
}
/* since pascal_string == NULL no need to call free */
return 0;
}