簡體   English   中英

了解C字符串串聯

[英]Understanding C String Concatenation

對於用C進行的評估,我必須獲取其中包含字符串的兩個文件,以及將它們連接在一起的字符串,例如:

如果file1包含

Now is the

time for all

good men to

come to the aid of

the party.

和file2包含:

alpha

beta

gamma

然后從

scat XX file1 file2

(scat是程序名稱)

應該

Now is theXXalpha

time for allXXbeta

good men toXXgamma

come to the aid ofXX

the party.XX

和來自的輸出

scat XX file2 file1

應該

alphaXXNow is the

betaXXtime for all

gammaXXgood men to

XXcome to the aid of

XXthe party.

為了理解這一點,我一直在嘗試使用字符串連接嘗試將字符串手動連接在一起。

我的問題是(A:如何在c中訪問文件的各個行?)和B:如果手動輸入:

  char *str1 = "hello";

  char *str2 = "world";

沒有預定義的函數,我怎么將這些字符串加在一起。 我最初的想法是使用for循環:

 for(str1; *str1 != '\0'; str1++)

     if(*str1 == '\0')

       *str1++ = *str2++;

我唯一的問題是這是否會由於內存訪問而導致段錯誤?

當我在字符串中遇到“ \\ 0”時。如何擴展此字符串? 除非我只是將兩個字符串都復制到新的char str3 [200]中?

(以上所有內容都是為了幫助我理解字符串和字符串concat的工作原理,希望能對學習有所幫助。)

歐登

我不會為您這樣做,但是這里有一些提示/陷阱。

  1. 處理角盒。 如果文件沒有相同的行數怎么辦?

  2. 除非您真的必須支持無限制的行(請教您的教授),否則我建議輸入的緩沖區為2048個字符,輸出的緩沖區為5000(2 * 2048 +串聯字符串)。

  3. 您需要使用fgets讀取兩個文件的輸入緩沖區,然后將它們與strncat串聯。

從輸入文件中讀取行的方式可能應該基於您的教授教給您的功能或您所閱讀的內容。 當然,這不是最好的方法,但是一種簡單的方法是使用fopen()打開文件,然后使用getline()讀取每一行。 這很簡單,但是需要您分配多余的緩沖區空間(如果不確定是否需要多少空間,可能會導致緩沖區溢出)。 它還要求您從輸入的每一行中修剪\\ n。

至於不使用內置函數進行連接,建議的方法可能會遇到您擔心的問題。 您需要知道可以寫入多少空間,如果超出該范圍,您就會遇到麻煩(並且您會收到麻煩)。 為了放置輸出而創建一個新的緩沖區將使您安全,但是建議您創建兩個新的緩沖區。 只需要一個。

如果需要提示,請查看Martin Broadhurst的“用C語言閱讀文本文件”strcat()函數背后的源代碼。 互聯網上有很多地方都可以找到strcat()源代碼。

好吧,如果唯一的目標是從兩個文件讀取並寫入stdout,則只需要一個字符緩沖區就足夠了,而一個簡單的狀態機就可以完成字符串連接。

#include <stdio.h>

int main (int argc, char **argv)
{
FILE *fp1, *fp2;
int ch, state ;

if (argc < 4) {
        fprintf(stderr, "Argc=%d, should be > 3\n", argc);
        return 0;
        }

for (state = 0; state < 42;     ) {
        switch (state) {
        case 0:
                fp1 = fopen (argv[2], "r"); if (!fp1) return 0;
                fp2 = fopen (argv[3], "r"); if (!fp2) { fclose (fp1); return 0;}
                state++;
        case 1:
                ch = fgetc(fp1);
                if (ch == EOF) state = 10;
                else if (ch == '\n') state =2;
                else putchar(ch);
                break;
        case 2:
                fputs( argv[1], stdout);
                state = 3;
        case 3:
                ch = fgetc(fp2);
                if (ch == EOF) state = 22;
                else if (ch == '\n') state =4;
                else putchar(ch);
                break;
        case 4:
                putchar(ch);
                state = 1;
                break;
        case 10: /* fp1 exhausted */
                ch = fgetc(fp2);
                if (ch == EOF) state = 30;
                else if (ch == '\n') state = 12;
                else {
                        fputs( argv[1], stdout );
                        putchar(ch);
                        state = 11;
                        }
                break;
        case 11:
                ch = fgetc(fp2);
                if (ch == EOF) state = 13;
                else if (ch == '\n') state = 12;
                else putchar(ch);
                break;
        case 12:
                putchar(ch);
                state = 10;
                break;
        case 13:
                putchar('\n');
                state = 30;
                break;
        case 20: /* fp2 exhausted */
                ch = fgetc(fp1);
                if (ch == EOF) state = 30;
                else if (ch == '\n') state = 21;
                else putchar(ch);
                break;
        case 21:
                fputs( argv[1], stdout);
                state = 22;
        case 22:
                putchar('\n');
                state = 20;
                break;
        case 30: /* both fp1+fp2 exhausted */

                fclose (fp1);
                fclose (fp2);
                state = 42;
                }
        }
return 0;
}

免責聲明:請勿在家中嘗試此操作。

暫無
暫無

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

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