該程序基於鏈接列表。讀取一個字符串,提取所有由換行符分隔的子字符串。當找到換行符時,讀取一個字符串並將每個字符串存儲在數組中
輸入應該是:
hello world\ngood bye\nWhat a nice day!\n\0
然後,預期輸出應該是:
[hello world]->[good bye]->[What a nice day]->
但是,當我運行該程序,然後鍵入:
hello world\ngood bye\nWhat a nice day!\n\0
我的輸出:
[hello world\ngood bye\nWhat a nice day!\n\0]->
我嘗試將NULL字符分別讀作'\'和'n',但無法處理它。我怎樣才能修復它,打印出預期的輸出?
newTB(char text []); //函數說明
函數newTB分配一個新的文本緩衝區,並用數組中給出的文本初始化它的內容。輸入數組中的行全部以'\ n'結尾。整個文本以'\ 0'結尾。
char * dumpTB(TB tb);
以下函數不會改變它們的文本緩衝參數。分配並返回包含給定文本緩衝區中文本的數組。文本緩衝區中的每一行都需要以'\ n'結尾(這包括最後一行)。整個文本必須以'\ 0'結尾。調用者有責任釋放由返回數組佔用的內存。如果文本緩衝區中沒有行,則返回NULL。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct textbuffer *TB;
typedef struct textbuffer {
char *texts;
TB next;
} textbuffer;
char *dumpTB (TB tb) { // my version of dumpTB
TB temp = malloc(sizeof(struct textbuffer));
temp->texts = tb->texts;
temp->next = NULL;
return (temp->texts);
}
TB newTB (char text[]){ // get the array from main function
TB newText = malloc(sizeof(struct textbuffer)); // return the node
newText->texts = text;
//strcpy(newText->texts,text);
newText->next = NULL;
return (newText);
}
void printList(TB tb){ //print entire list
TB curr = tb;
while(curr != NULL){
printf("[%s]-> ",curr->texts);
curr = curr->next;
}
printf("\n");
}
int main(int argc, char * argv[]) {
int i=0;
int j=0;
char str[MAX_TEXT];
char cpy[MAX_TEXT];
char tmp[MAX_TEXT];
TB textList = NULL;
TB list = NULL;
list = textList;
fgets(str, MAX_TEXT, stdin); // input should be like
// hello\nworld\ngood\nbye\n\0
while(str[i] != '\0') {
if(str[i] == '\n') {
cpy[i] = '\0';
strcpy(tmp,cpy);
textList = newTB(tmp);
list = textList;
textList->texts = dumpTB(textList);
//TB newList = malloc(sizeof(struct textbuffer));
//list = textList;
// newList->texts = textList->texts;
textList = textList->next;
j=0;
}
cpy[j++] = str[i++];
}
printList(list);
return 0;
}
你想'CPY [J] = '\ 0'' – chux
'' \ n''是一個換行符,而你輸入兩個字符,一個反斜線\和字母 'N',那麼你的比賽從未成功。即使你輸入了真正的換行符,你的程序也不會做你想要的,因爲'fgets'將停止在第一個換行符處讀取,產生「hello」。 – codnodder
我嘗試了兩個,但仍然無法正常工作..所以我應該改變哪一部分? –