Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解C字符串连接_C_String_String Concatenation - Fatal编程技术网

理解C字符串连接

理解C字符串连接,c,string,string-concatenation,C,String,String Concatenation,对于C语言的评估,我必须使用两个包含字符串的文件,以及一个将它们连接在一起的字符串,例如: 如果文件1包含 Now is the time for all good men to come to the aid of the party. 文件2包含: alpha beta gamma 然后从 scat XX file1 file2 scat XX file2 file1 (scat是程序名) 应该是 Now is theXXalpha time for allXXbeta

对于C语言的评估,我必须使用两个包含字符串的文件,以及一个将它们连接在一起的字符串,例如:

如果文件1包含

Now is the

time for all

good men to

come to the aid of

the party.
文件2包含:

alpha

beta

gamma
然后从

scat XX file1 file2
scat XX file2 file1
(scat是程序名)

应该是

Now is theXXalpha

time for allXXbeta

good men toXXgamma

come to the aid ofXX

the party.XX
alphaXXNow is the

betaXXtime for all

gammaXXgood men to

XXcome to the aid of

XXthe party.
以及

scat XX file1 file2
scat XX file2 file1
应该是

Now is theXXalpha

time for allXXbeta

good men toXXgamma

come to the aid ofXX

the party.XX
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++;
我唯一的问题是,这不会因为内存访问而导致seg故障吗

当我在字符串中遇到“\0”时..如何扩展此字符串?除非我只是将这两个字符串复制到一个新的字符str3[200]中

(以上所有内容都是为了帮助我理解弦乐和弦乐康卡特是如何工作的,如有任何帮助,我将不胜感激。)


Euden

你如何阅读输入文件中的行可能应该基于你的教授教过你或你读过的函数。当然不是最好的方法,但是一个简单的方法是使用fopen()打开文件,然后使用getline()读取每一行。这很简单,但需要分配多余的缓冲区空间(如果不确定需要多少空间,则可能会出现缓冲区溢出)。它还要求您从每行输入中修剪\n


至于在不使用内置函数的情况下进行连接,您提出的方法可能会遇到您担心的问题。你需要知道你有多少空间可以写,如果超过了这个范围,你就是在自找麻烦(你会得到它)。为放置输出创建一个新的缓冲区将保证您的安全,但您建议创建两个新的缓冲区;只需要一个。

我不会为你做这件事,但这里有一些提示/陷阱

  • 处理角落里的案子。如果这些文件的行数不相同怎么办

  • 除非你真的需要支持无限行(问问你的教授),否则我建议输入缓冲区为2048个字符,输出缓冲区为5000个(2*2048+串联字符串)

  • 您需要使用
    fgets
    读取两个文件的输入缓冲区,然后将它们与
    strncat
    连接起来


  • 如果需要提示,请查看Martin Broadhurst的源代码和函数。互联网上有许多地方可以使用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;
    }
    
    #包括
    int main(int argc,字符**argv)
    {
    文件*fp1,*fp2;
    int ch,state;
    如果(argc<4){
    fprintf(stderr,“Argc=%d,应该大于3\n”,Argc);
    返回0;
    }
    对于(状态=0;状态<42;){
    开关(状态){
    案例0:
    fp1=fopen(argv[2],“r”);如果(!fp1)返回0;
    fp2=fopen(argv[3],“r”);如果(!fp2){fclose(fp1);返回0;}
    状态++;
    案例1:
    ch=fgetc(fp1);
    如果(ch==EOF)状态=10;
    如果(ch='\n')状态=2,则为else;
    else-putchar(ch);
    打破
    案例2:
    FPUT(argv[1],标准输出);
    状态=3;
    案例3:
    ch=fgetc(fp2);
    如果(ch==EOF)状态=22;
    如果(ch='\n')状态=4,则为else;
    else-putchar(ch);
    打破
    案例4:
    putchar(ch);
    状态=1;
    打破
    案例10:/*fp1耗尽*/
    ch=fgetc(fp2);
    如果(ch==EOF)状态=30;
    如果(ch='\n')状态=12,则为else;
    否则{
    FPUT(argv[1],标准输出);
    putchar(ch);
    国家=11;
    }
    打破
    案例11:
    ch=fgetc(fp2);
    如果(ch==EOF)状态=13;
    如果(ch='\n')状态=12,则为else;
    else-putchar(ch);
    打破
    案例12:
    putchar(ch);
    状态=10;
    打破
    案例13:
    putchar('\n');
    状态=30;
    打破
    案例20:/*fp2耗尽*/
    ch=fgetc(fp1);
    如果(ch==EOF)状态=30;
    如果(ch='\n')状态=21,则为else;
    else-putchar(ch);
    打破
    案例21:
    FPUT(argv[1],标准输出);
    国家=22;
    案例22:
    putchar('\n');
    州=20;
    打破
    情况30:/*fp1和fp2均已耗尽*/
    fclose(fp1);
    fclose(fp2);
    国家=42;
    }
    }
    返回0;
    }
    

    免责声明:不要在家中尝试此操作。

    调用程序
    scat
    可能会对实现质量造成意外影响。C语言中的字符串处理是一件令人讨厌的事情。如果您真的想处理任意长度的行,请准备编写大量循环和
    malloc
    s
    strncat
    fgets
    将是您的主要辅助功能。如果你可以假设两个文件都完全符合内存,问题就简单多了。如果你可以使用预定义函数,你可以考虑使用标准的Strut,Strucy。StnCAT和StncPy比较安全,但是做同样的事情。你确定你不允许使用C++吗?你需要问一个具体的问题。对你现在拥有的东西的评论:当你写