我試圖從stdin中讀取輸入的資訊,并將其決議成一個指標陣列(每個指標代表一行)。然而,當我試圖列印它們時,它只列印了第一行。我看不出其余的問題出在哪里。(這是K&R的一個練習的一部分)。) 另外,我知道記憶體泄漏的問題,但它現在對我來說并不構成問題。
#include <stdlib.h>/span>
#include <stdio.h>
#include <string.h>
#define MAXLINES 5000
char *lineptr[MAXLINES] 。
int readlines(char *[], int) /span>;
void writelines(char *[], int);
main(int argc, char *argv[] )
{
int i, nlines;
for (i = 0; i < MAXLINES; i)
{
lineptr[i] = malloc(MAXLINES * sizeof(**lineptr))。
}
nlines = readlines(lineptr, MAXLINES)。
writelines(lineptr, nlines)。
return 0;
}
int readlines(char *lineptr[], int nlines)
{
int num;
char *c_ptr = *lineptr;
for (num = 0; (*c_ptr = getchar() != EOF; c_ptr)
{
if (*c_ptr == '
')
{
*c_ptr = ' ';
c_ptr = * lineptr;
if ( num >= nlines)
{
return num;
}
}
}
*c_ptr = ''/span>;
return num;
}
void writelines(char *lineptr[], int nlines)
{
while (nlines--)
{
printf("%s
", *lineptr )。
}
}
uj5u.com熱心網友回復:
當這一行運行時:
c_ptr = * lineptr;
c_ptr 指向下一行的第一個字符。 然后它回到回圈的頂部,在那里c_ptr被遞增。 這意味著第二行和后續行的第一個字符從未被寫入。 當你試圖列印這些行時,你讀到的是恰好在那里的任何垃圾值。 如果這個值正好是0,你就列印一個空行。
不要使用 for 回圈,使用 while 回圈,并且只在你沒有進入一個新行時增加 c_ptr。 此外,將c_ptr的重新賦值移到下一行之后你檢查行計數器,否則你就讀過了lineptr陣列的末端。
num = 0;
while ((*c_ptr = getchar() ) != EOF)
{
if (*c_ptr == '
')
{
*c_ptr = ' ';
if ( num >= nlines)
{
return num;
}
c_ptr = * lineptr;
} else {
c_ptr。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/315442.html
標籤:
上一篇:雙重指標和底層指標
下一篇:Rust:從原始指標加載數值
