#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//the function
char* scan(char *string)
{
int c; //as getchar() returns `int`
string = malloc(sizeof(char)); //allocating memory
string[0]=' ';
for(int i=0; i<100 && (c=getchar())!='n' && c != EOF ; i++)
{
string = realloc(string, (i+2)*sizeof(char)); //reallocating memory
string[i] = (char) c; //type casting `int` to `char`
string[i+1] = ' '; //inserting null character at the end
}
return string;
}
char** bigScan(char **string)
{
int c;
string=malloc(sizeof(char *));
string[0]=' ';
for(int i=0;(c=getchar()!=EOF);i++)
{
*string = realloc(string, (i+2)*sizeof(char *)); //reallocating memory
string[i] = scan(string[i]); //type casting `int` to `char`
string[i+1] = ' '; //inserting null character at the end
}
return string;
}
int main(void)
{
char **buf; //pointer to hold base address of string
buf=bigScan(buf);
printf("%sn",buf[0] );
}
基本上,扫描函数读取每一行,直到EOF或新行。BigScan的作业是通过调用扫描函数来读取多行(指向字符串指针),直到我们达到EOF为止。因此,从本质上讲,大型扫描将指针返回指针,我们可以使用此扫描读取整个文本。我的方法做错了什么?基本上是在我的bigscan中调用扫描功能,直到我达到eof。
Ideal Input:
"Hi guys and girls
This is a message in multiple lines."
Ideal Output:
"Hi guys and girls
This is a message in multiple lines."
-
bigScan
内部的(c=getchar()!=EOF)
无效。它将1
或0
的值分配给C,因为bool
值是!=
比较的结果。 -
bigScan
内部的getchar()
将使您每行松动一个字符,因为该字符无处可保存。 -
bigScan
中的分配无效。您不应该为字符串*string = realloc(string
分配内存,但是您应该为指针本身分配内存。string = realloc(string, ... sizeof(char*))
。 -
NULL
是用于指针的终止值。不要将' '
用于指针。 - 使用
size_t
存储尺寸。 - 如果您要覆盖参数,传递参数值几乎没有意义。在此函数中,变量
a
是未使用的void f(int a) { a = 1; }
,因为输入功能后,您的两个功能中的变量string
都会立即分配。 - 函数
scan
具有i<100
字符的硬限。
以下是您功能的固定版本。还更名为变量。并删除参数。和不同的凹痕。并使用来自标准#include <assert.h>
的assert
离子用作原始错误检查。并且使用ungetc
,因此bigScan
中读取的字符不会消失。而且我没有运行此代码,所以它有很多错误。
char* scan(void)
{
char *string = malloc(sizeof(*string));
assert(string != NULL);
string[0] = ' ';
size_t stringlen = 1;
for(int c; (c=getchar()) != 'n' && c != EOF;) {
void * const ptr = realloc(string, (stringlen + 1) * sizeof(*string));
assert(ptr != NULL);
stringlen++;
string[stringlen - 2] = c;
string[stringlen - 1] = ' '; //inserting null character at the end
}
return string;
}
char** bigScan(void)
{
char **strings = malloc(sizeof(*strings));
assert(strings != NULL);
strings[0] = NULL;
size_t stringslen = 1;
for(int c; (c = getchar()) != EOF;) {
ungetc(c);
void * const ptr = realloc(strings, (stringslen + 1) * sizeof(*strings));
assert(ptr != NULL);
strings = ptr;
stringslen++;
strings[stringslen - 2] = scan();
strings[stringslen - 1] = NULL;
}
return strings;
}