чтение и сохранение известного количества строк неизвестной длины строк - PullRequest
1 голос
/ 03 мая 2019

Я хочу получить количество строк ввода от пользователя, затем прочитать и сохранить строки неизвестной длины в массиве.

Я знаю, что способ сохранения строк неправильный, но я не знаюне знаю, как это исправить.

int nos; // number of strings
scanf_s("%d", &nos);
char** strs = malloc(nos * sizeof(char*)); // array of strings
for (int i = 0; i < nos; i++) // receiving strings
{
    scanf_s("%s", (strs+i));
}

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Вы близки, но вы забыли выделить память для строки. Если вы работаете с POSIX-совместимыми системами (т.е. практически со всем, кроме Windows), используйте спецификатор формата %ms scanf(), чтобы выделить буфер для строки при ее чтении (обратите внимание, что это прекращается после пробела) :

scanf("%ms", &strs[i]);

Для Windows реализуйте gets() -подобную функцию:

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

int msgets(char **str)
{
    int ch = 0;
    size_t len = 0;

    while(ch != '\n')
    {
        len++;
        *str = realloc(*str, len);
        ch = getchar();
        (*str)[len-1] = ch;
    }
    (*str)[--len] = 0;
    return len;
}

Вот как использовать его вместо строки scanf():

msgets(&strs[i]);

Кроме этого, ваш код выглядит хорошо.

Вот почти полный пример с моим кодом:

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

int msgets(char **str)
{
    int ch = 0;
    size_t len = 0;

    while(ch != '\n')
    {
        len++;
        *str = realloc(*str, len);
        ch = getchar();
        (*str)[len-1] = ch;
    }
    (*str)[--len] = 0;
    return len;
}

int main(void)
{
    int nos; // number of strings
    scanf("%d ", &nos);
    char** strs = malloc(nos * sizeof(char*)); // array of strings
    for (int i = 0; i < nos; i++) // receiving strings
    {
        msgets(&strs[i]);
    }
    /* Do something with strs[] here */
    return 0;
}
0 голосов
/ 03 мая 2019

если вы внимательно прочитаете этот ответ Как я могу прочитать строку ввода неизвестной длины? и изменить ваш код, это должно быть что-то вроде этого.Я также добавляю печать для цикла, чтобы увидеть результаты этого кода

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

char *inputString(FILE* fp, size_t size){
    char *str=NULL;
    int ch;
    size_t len = 0;
    str = realloc(str, sizeof(char)*size);
    if(!str){
      printf("[DEBUG]\n");
      return str;
    }
    while(EOF!=(ch=fgetc(fp)) && ch != '\n'){
        str[len++]=ch;
        if(len==size){
            str = realloc(str, sizeof(char)*(size+=16));
            if(!str)return str;
        }
    }
    str[len++]='\0';

    return realloc(str, sizeof(char)*len);
}


void empty_stdin (void) /* simple helper-function to empty stdin */
{
    char c;
    while ((c = getchar()) != '\n' && c != EOF);
    return;
}


int main(void){
  int nos,i; /*number of strings*/
  scanf("%d", &nos);
  empty_stdin();
  char ** strs = malloc(nos * sizeof(char*)); /*array of strings*/
  for (i = 0; i < nos; i++) {/*receiving strings*/
      *(strs+i) = inputString(stdin,1);
  }
  for(i=0;i<nos;i++){
    printf("%s\n",*(strs+i));
  }
  return 0;
}

input:

3
123456789
foo
hello world

output:

123456789
foo
hello world
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...