了解C字符串连接

对于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. 

为了理解这一点,我一直在尝试使用字符串连接来尝试手动连接字符串。

我的问题是(答:我如何访问c中文件的各个行?)和B:如果我手动输入:

  char *str1 = "hello"; char *str2 = "world"; 

如何在没有预定义function的情况下将这些字符串添加到一 我最初的想法是使用for循环:

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

我唯一的问题是,由于内存访问,这不会导致seg故障吗?

当我在一个字符串中遇到’\ 0’时,我可以扩展这个字符串吗? 除非我只是将两个字符串复制到一个新的字符串str3 [200]?

(以上所有内容都是为了帮助我理解字符串和字符串连接是如何工作的,任何学习这方面的帮助都会受到赞赏。)

Euden

好吧,如果唯一的目标是从两个文件读取,并且写入stdout,只有一个字符的缓冲区就足够了,并且一个简单的状态机就可以了,就不需要字符串连接。

 #include  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; } 

免责声明:不要在家里试试。

我不打算为你做,但这里有一些提示/陷阱。

  1. 处理角落案件。 如果文件的行数不同,该怎么办?

  2. 除非你真的必须支持无限行(问你的教授),我建议输入2048个字符的缓冲区和输出5000个(2 * 2048 +串联字符串)。

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

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

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

如果您需要提示,请查看Martin Broadhurst 在C中读取文本文件和函数strcat()背后的源代码。 互联网上有很多地方可以使用strcat()源代码。