了解C字符串串联

问题描述:

对于C中的assesment我得把两个文件内他们字符串,字符串将它们拼接在一起,例如:了解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. 

为了理解这个I”我一直试图玩弄字符串concat试图手动将字符串连接在一起。

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

char *str1 = "hello"; 

    char *str2 = "world"; 

如何将我一起添加这些字符串没有预定义的函数。我最初的想法是使用一个for循环:

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

    if(*str1 == '\0') 

     *str1++ = *str2++; 

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

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

(以上所有的尝试和帮助我了解如何字符串和字符串连接的作品,在学习本的任何援助将不胜感激。)

Euden

+6

调用程序'scat'可能会导致意想不到的内涵与实施的质量。 – 2012-03-04 13:18:57

+0

在C中的字符串处理是讨厌的业务。如果你真的想处理任意长度的线条,准备写很多循环和'malloc'。 'strncat'和'fgets'将成为你的主要工作者功能。如果你能假设这两个文件完全适合内存,问题会变得更简单。 – 2012-03-04 13:22:10

+0

如果你可以使用预定义的函数,你可以考虑使用标准的strcat,strcpy。 strncat和strncpy比较安全,但是要做同样的事情。 – LLS 2012-03-04 13:24:07

那么,有没有必要字符串连接,如果唯一的目标就是从两个文件读,写到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; 
} 

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

+0

这看起来很多比我的意思,以实现我觉得比较复杂,实际assesment需要我用串联提供的字符串。虽然阅读和打印出来,以屏幕是由我的教授,而不是使用预定义的函数 – 2012-03-04 19:24:31

+0

好suggessted,它只是作为的事情怎么可能* *是一个例证。请注意,它也可用于字符串大于可用内存的输入文件。使用fgets()而不是fgetc()的版本也是可能的,需要大约一半的状态。 – wildplasser 2012-03-04 22:00:28

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

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

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

  1. 处理角落案件。如果这些文件没有相同的行数?

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

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

+0

为什么要连接'strncat()'?为什么不将它们连接起来与'的printf(“%s%s%S \ n”,一号线,分离器,2号线)输出;',在这里我假设线有换行符砍掉了,因为他们被读取。 – 2012-03-08 00:54:18

+0

@JonathanLeffler:这是一个解决方案太多,但'strncat'是更多的语义。 – orlp 2012-03-08 07:23:29

如果需要提示,检查马丁后面布罗德赫斯特的Reading a Text File in C和功能strcat()的源代码。互联网上有很多地方可以使用strcat()的源代码。