读取并保存未知长度的字符串的已知行数

时间:2019-05-03 16:47:47

标签: c windows

我想从用户那里接收输入的行数,然后读取未知长度的行并将其保存在数组中。

我知道我保存行的方式是错误的,但是我不知道如何纠正它。

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 个答案:

答案 0 :(得分:1)

您已经关闭,但是您忘记为该字符串分配内存。如果您使用的是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;
}

答案 1 :(得分:-1)

如果您仔细阅读了此答案How can I read an input string of unknown length?,并修改了代码,则应该是这样的。 我还添加了一个print for循环以查看此代码的结果

#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;
}

输入:

3
123456789
foo
hello world

输出:

123456789
foo
hello world