簡體   English   中英

如何比較char *數組(如果將其保存在C中的堆棧中)

[英]how compare char * array if keep it in stack in C

char *file1charbuf=(char*)malloc(sizeof(char));
char *file2charbuf=(char*)malloc(sizeof(char));

循環運行,直到EOF將char讀入*file1charbuf*file2charbuf ,然后進行比較。

...
check=read(file1, file1charbuf, 1);
check2=read(file2, file2charbuf, 1);
if (*file1charbuf!=*file2charbuf){
         printf("differ: char %i, line %i\n",charpos,linepos);
         exit(1);
}
....

比較工作正常,但我想保持指針在堆棧中,而不是在堆中。 malloc也是C lib函數。

char *file1charbuf[1]; //1 element array of char
char *file2charbuf[1];

與比較不起作用

...
if (file1charbuf[0]!=file2charbuf[0]){
         printf("differ: char %i, line %i\n",charpos,linepos);
         exit(1);
}
...

第二個問題。 如果找到exit(1)是否有必要close(file1)嗎?

  • 我應該只使用sys調用,而不要使用lib函數。

恐怕您顯示的代碼有很多問題:

  1. 不要在C中malloc()的返回值
  2. sizeof (char)在C中始終為1,因此像這樣使用它是毫無意義的。
  3. 當您似乎是指字符數組時,您是在聲明指向字符的指針數組。

    char *file1charbuf[1]; //1 element array of char char *file1charbuf[1]; //1 element array of char應為
    char file1charbuf[1]; /* 1-element array of char */ char file1charbuf[1]; /* 1-element array of char */或者,當然
    char file1charbuf; /* 1-character buffer. */

  4. 您正在使用1字節緩沖區執行read() ,這效率極低。

  5. 要將字符數組(不一定是字符串,即不必以零結尾)與多個字符進行比較,請使用memcmp()
  6. 最好在調用exit()之前在所有打開的文件描述符上調用close() exit() 在大多數操作系統上,進程的終止將導致其所有資源的重新利用,但最好進行明確的處理。 如果文件I / O使用的是基於FILE*的緩沖調用,則無需這樣做,因為在所有環境中,這些都由exit()自動關閉。

char *file1charbuf[1]; 是一個指向char指針的數組。 如果要一個由一個char的數組,請使用char file1charbuf[1]

定義不是指向char數組的指針,而是char數組。

char file1charbuf[1]; //1 element array of char
char file2charbuf[1];

使用堆上分配的內存和堆棧上分配的內存的字符串比較語義沒有區別。

...
char c1, c2;
check=read(file1, &c1, 1);
check2=read(file2, &c2, 1);
if (c1!=c2) {
...

代碼比較兩個文件,並列出不同的行和字符。 它不會逐行比較它們,而是逐個字符地進行比較,但是會跟蹤行號並將文件加載到4 KB的塊中。

#define BLOCKSIZE 4096

char file1charbuf[BLOCKSIZE]; //4096 character buffer in stack
char file2charbuf[BLOCKSIZE];
int linepos=1, charpos =1, i, b1, b2 ;
int file1 = open("1.txt", O_RDONLY);
int file2 = open("2.txt", O_RDONLY);

do{
   b1=read(file1, file1charbuf, BLOCKSIZE);
   b2=read(file2, file2charbuf, BLOCKSIZE);
   for(i=0; i < b1 && i < b2; ++i){
      if (file1charbuf[i]!=file2charbuf[i]){
         printf("differ: char %i, line %i\n",charpos,linepos);
         close(file1);
         close(file2);
         exit(1);
      }
      if (file1charbuf[i] == '\n'){
         ++linepos;
         charpos=0;
      }
      ++charpos;
   }
}while(   (b1 == BLOCKSIZE || (file1==STDIN && file1charbuf[b1-1] != 0x26)) 
       && (b2 == BLOCKSIZE || (file2==STDIN && file2charbuf[b2-1] != 0x26)) );

if (b1 != b2)
   printf("One bigger than the other\n");
close(file1);
close(file2);

關於從STDIN中閱讀:

當您按Enter鍵時,來自stdin的read()會解除阻止。 那時,只有您到目前為止輸入的字符可以讀取。 這意味着b1將等於您到目前為止鍵入的字符。 do-while條件將失敗,因為讀取未讀取其請求的所有4096字節,這將使其認為是因為流已結束。 要在\\ n之后繼續讀取,我們必須更改while條件,以便如果我們正在讀取的文件描述符是STDIN, 0x26繼續讀取,除非我們讀取的最后一個字符是我認為是0x26的流結束字符。 我希望^ D也可以像enter一樣取消阻塞read()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM