[英]How can I read a paragraph in via the terminal as a single string in C?
我正在編寫一個 C 程序,該程序應該從用戶的一篇文章中讀取。 文章分為多個段落。 我不知道這篇文章有多少行或字符,但我知道它以哈希符號 ( #
) 結尾。 我只想使用保存文章所需的內存。
這是我迄今為止嘗試過的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main(){
int size;
char *essay;
printf("\n how many characters?\n");
scanf("%d", &size);
essay =(char *) malloc(size+1);
printf("Type the string\n");
scanf("%s",essay);
printf("%s",essay );
}
正如我之前所說,我事先不知道(也不想詢問)字符數。 如何動態分配內存以節省空間? (什么是動態內存分配?)有沒有另一種不依賴動態分配的方式來節省內存?
此外,我的代碼現在一次只讀取一行。 如何讀取多行並將它們存儲為單個字符串?
這是另一個代碼
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char input;
int count = 0;
int n;
char* characters= NULL;
char* more_characters = NULL;
do {
printf ("type the essay:\n");
scanf ("%d", &input);
count++;
more_characters = (char*) realloc (characters, count * sizeof(char));
if (more_characters!=NULL) {
characters=more_characters;
characters[count-1]=input; }
else {
free (characters);
printf ("Error (re)allocating memory");
exit (1);
}
} while (input!='#');
printf ("the essay: ");
for (n=0;n<count;n++) printf ("%c",characters[n]);
free (characters);
}
它不工作
您可以一次讀取字符並將其復制到您的論文緩沖區中。 當您的論文緩沖區空間不足時,您可以執行重新分配以獲取另一塊內存。 當您讀取的字符是“#”時,您就完成了。
嗯,“不要浪費內存空間”,
那么過度調用realloc()
呢?
char *Read_Paragraph_i(void) {
size_t size = 0;
size_t i = 0;
char *dest = NULL;
int ch;
while ((ch = fgetc(stdin)) != EOF) {
if (ch == '#') break;
size++;
char *new_ptr = realloc(dest, size);
assert(new_ptr);
dest = new_ptr;
dest[i++] = ch;
}
size++;
char *new_ptr = realloc(dest, size+);
assert(new_ptr);
dest = new_ptr;
dest[i++] = '\0';
return dest;
}
每次需要更多內存時,更明智的方法是將分配大小加倍,暫時浪費內存,然后是最終的“正確大小”分配。
如果這可以使用 C++,您可以使用 string (std::string),它會隨着添加字符的需要而增長。 如果你不能,那么你將不得不使用 malloc 創建一個數組來保存字符。 當它已滿時,您將不得不創建一個新的,並將當前數據從舊的數據復制到新的數據,然后添加新字符。 您可以對讀取的每個字符執行此操作以使用最少的內存,但這效率太低了。 更好的方法是在chucks 中分配字符數組,保持當前大小,以及當前其中的字符數。 當您想添加另一個字符並且數組已滿時,您分配一個比當前字符數大一些的新字符,將當前大小更新為新字符的大小,然后添加新字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.