在下面的代碼中,我嘗試使用函式 usergetline 從 STDIN 讀取輸入行,在主函式中,我將輸入字串分配給一個字符指標陣列。(char *lineptr[MAXCOUNTLINE])
在第一個 while 回圈中,輸入行存盤在 lineptr 中(當我列印 lineptr[iplinecount] 時可以看到),但是,一旦我離開回圈,它列印的只是新行。
#include <stdio.h>
#include <string.h>
/* function declarations */
int usergetline(char *, int);
/* constants */
#define MAXCOUNTLINE 10
#define MAXLINECOUNTWIDTH 100
#define DEFPRINTFRLASTCOUNT 8
void main(int argc, char *argv[])
{
char *ipline;
int iplinecount,shifter;
iplinecount=0;
char *lineptr[MAXCOUNTLINE];
/* continue to accept the lines till the time EOF is not encountered and
* max count of lines is not exceeded */
while((iplinecount < MAXCOUNTLINE) && (usergetline(ipline,MAXLINECOUNTWIDTH) >0)){
lineptr[iplinecount] = ipline;
#ifdef DEBUG
printf("iplinecount: %d\n",iplinecount);
printf("ipline: %s\n",ipline);
printf("strlen of ipline: %d\n",strlen(ipline));
printf("*(lineptr iplinecount): %s\n",lineptr[iplinecount]);
printf("strlen of *(lineptr iplinecount): %d\n",strlen(lineptr[iplinecount]));
printf("value at ipline %p\n",ipline);
printf("value at *(lineptr iplinecount) %p\n",lineptr[iplinecount]);
#endif
iplinecount ;
}
printf("iplinecount = %d\n",iplinecount);
shifter=0;
while(shifter < iplinecount){
printf("strlen: %d\n",strlen(*(lineptr shifter)));
printf("%s\n",*(lineptr shifter));
shifter ;
}
}
/* usergetline: function to accpet an input line from STDIN */
int usergetline(char *ipline, int maxlengthofip)
{
char c;
int i=0;
while((maxlengthofip-1) && ((c=getchar()) != EOF) && (c != '\n')){
maxlengthofip--;
*ipline=c;
ipline ;
i ;
}
if (c=='\n'){
*ipline='\n';
ipline ;
i ;
}
*ipline = '\0';
return i;
}
假設這個檔案名是練習5-13.c。我正在使用 cygwin 環境。編譯后(使用 -D DEBUG 標志),當我執行程式時,如 ./exercise5-13.exe 輸出為:
testing
iplinecount: 0
ipline: testing
strlen of ipline: 8
lineptr[iplinecount]: testing
strlen of lineptr[iplinecount]: 8
value at ipline 0xffffcdf0
value at lineptr[iplinecount] 0xffffcdf0
iplinecount = 1
strlen=0
我有限的理解和反對初始化字符指標陣列的論點是,當我分配時(第 21 行)
''' lineptr[iplinecount] = ipline; '''
然后, lineptr 被分配了一個 ipline 地址,在這種情況下,它本身指向從 STDIN測驗中獲取的字串常量。我期望從 STDIN 獲取的每個新字串首先存盤在行指標中,并且從它們中,字串的第一個元素的地址將存盤在字符指標陣列中。但是,char指標陣列是空的?
uj5u.com熱心網友回復:
您正在使用未初始化的指標
char *ipline;
//...
usergetline(ipline,MAXLINECOUNTWIDTH)
在usergetline呼叫未定義行為的函式中。
您需要動態分配要讀取資料的記憶體以及分配給指標的已分配記憶體地址ipline。因此,指標ipline必須通過指向該指標的指標的參考傳遞給函式。
在這種情況下,函式宣告看起來像
int usergetline(char **ipline, int maxlengthofip);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/392684.html
上一篇:在C中比較int和int*
