-1

我的任务是重定向一个文本文件并对其进行各种操作,一切正常,除了我有一个小问题:

所以读取输入的主要函数是getline1():

char* getline1(){
char *LinePtr = (char*)malloc(sizeof(char*)*LINE);
int i = 0;
for ( ; (*(LinePtr+i) = getc(stdin)) != '\n' ; i++){}
*(LinePtr+i) = '\0';
return LinePtr;
}

它返回一个指向单行字符数组的指针,

所以我们知道一个新行用 '\n' 字符分隔,

我以前遇到的问题是当我像这样编写 getline1() 函数时:

for (int i = 0 ; Line[i] != '\n' ; i++){
Line[i] = getc(stdin);
}

因为从逻辑上讲它可能是真实的,所以 getc() 是一个流式函数,我看到网上的回答说这不起作用,不太明白为什么。

无论如何,最大的问题是我需要知道文本中有多少行,以便我可以停止读取值,或者从 getline1() 函数中知道没有下一行,我已经完成了。

我们需要考虑的事情: 1.only <stdio.h> <stdlib.h> 需要使用 2.Im 使用 Linux Ubuntu 和 gcc 编译器 3.ridirection 类似于 ./Run<input.txt

我也知道 stdin 是一个文件指针,没有找到可以帮助我的方法。

谢谢你,丹尼斯

4

2 回答 2

1

EOF除了字符之外,您还应该检查信号newline,还应该检查您index-1的始终小于LINE以避免溢出并为NULL terminator.

#define LINE 100

char *my_getline(void)
{
    size_t i = 0;
    char *str = NULL;
    int c = 0;

     if ((str = malloc(LINE)) == NULL)
     {
         fprintf(stderr,"Malloc failed");
         exit(EXIT_FAILURE);
     }

    while (i+1 < LINE && (c = getchar()) != EOF && c != '\n') /* Saving space for \0 */
    {
        str[i++] = c;
    }
    str[i] = '\0';

    return str;
}
于 2021-01-01T19:30:57.767 回答
0

谢谢大家,我刚刚做了另一个函数来计算行这是唯一可用的懒惰选项:)

static void linecounter(){
FILE *fileptr;
int count = 0;
char chr;
fileptr = fopen("input.txt", "r");
chr = getc(fileptr);
while (chr != EOF){
if (chr == '\n'){count = count + 1;}
chr = getc(fileptr);}
fclose(fileptr);
count_lines = count;}
于 2021-01-01T20:53:00.640 回答