Прежде всего, НЕ используйте глобальные переменные, если это абсолютно не требуется.
Я предполагаю, что вы хотите, чтобы str был массивом указателей, а str [0] хранит первую строку, str [1] хранит вторую строку и так далее.
Для этого:
int line_pos = 0; //stores line_number
int char_pos = 0; //stores position in str[line_pos]
while(fgets(line, sizeof(line), stream))
{
printf ("%s", line);
int length = strlen(line);
strcpy(ch,line);
str[line_pos] = calloc(length, sizeof(char)); //allocating memory
for (i=0;i<length;i++)
{
if (ch[i] != ',')
{
*(str[line_pos]+char_pos) = ch[i]; //setting value of str[line][pos]
char_pos++;
}
}
char_pos = 0;
line_pos++;
}
printf("%s", str[0]); //print first line without comma
Обратите внимание, что он работает только для 20 строк (потому что вы объявили * str [20]), а затем для 21-й или более поздних строк это приводит к переполнению и может вызвать различные катастрофы. Вы можете включить:
if (line_pos >= 20)
break;
в качестве меры безопасности.
Обратите внимание, что для str выделяется немного больше памяти (memory selected = memory_required + количество запятых). Чтобы предотвратить это, вы можете установить ch
для текста без запятой:
for (i=0;i<length;i++)
{
int j = 0; //stores position in ch
if (line[i] != ',')
{
ch[j++] = line[i];
}
Затем выделите память для str [line_pos], например:
str[line_pos] = calloc(strlen(ch0, sizeof(char));