我想从用户那里接收输入的行数,然后读取未知长度的行并将其保存在数组中。
我知道我保存行的方式是错误的,但是我不知道如何纠正它。
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));
}
答案 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