理解C字符串连接
对于C语言的评估,我必须使用两个包含字符串的文件,以及一个将它们连接在一起的字符串,例如: 如果文件1包含理解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
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
至于在不使用内置函数的情况下进行连接,您提出的方法可能会遇到您担心的问题。你需要知道你有多少空间可以写,如果超过了这个范围,你就是在自找麻烦(你会得到它)。为放置输出创建一个新的缓冲区将保证您的安全,但您建议创建两个新的缓冲区;只需要一个。我不会为你做这件事,但这里有一些提示/陷阱
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
sstrncat
和fgets
将是您的主要辅助功能。如果你可以假设两个文件都完全符合内存,问题就简单多了。如果你可以使用预定义函数,你可以考虑使用标准的Strut,Strucy。StnCAT和StncPy比较安全,但是做同样的事情。你确定你不允许使用C++吗?你需要问一个具体的问题。对你现在拥有的东西的评论:当你写