如何将每个第n个字符从一个char数组复制到另一个char数组?

时间:2017-06-15 14:43:29

标签: c

我有一个读取文件A的程序,然后将内容复制到文件B. 我想写第三个字符的文件B.我创建了一个循环,将每三个项重写为一个新的char数组。在文件B中我得到了奇怪的字符。我做错了什么?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

 int main ()
 {
    int i;
    char full_string[100]; 
    char reduce_string[100]; 

    char file_name_for_read[128];
    char file_name_for_save[128];

    printf("Enter file name for read...\n");
    scanf ("%s", file_name_for_read);

    strcat(file_name_for_read,".txt");
    FILE *fileA;
    fileA=fopen(file_name_for_read,"r");

    printf("Enter file name for save...\n");
    scanf ("%s", file_name_for_save);

    strcat(file_name_for_save,".txt");
    FILE *fileB;
    fileB=fopen(file_name_for_save,"w");

    while(fgets(full_string, sizeof(full_string), fileA) !=NULL) 
    {

        for(i = 2; i < 100; i+=3)
        {
        reduce_string[i-=2] = full_string[i+=1];
        }
        fprintf(fileB, "%s", reduce_string); 
    }

    fclose(fileA);
    fclose(fileB);

}

5 个答案:

答案 0 :(得分:8)

  

我做错了什么?

有几件事。至少,

  • 在内部循环中,迭代full_string的整个长度,无论最近fgets()从文件中实际读取了多少这些字节。

  • 在内部循环中,您调用未定义的行为,因为表达式reduce_string[i-=2] = full_string[i+=1]i的值有两个副作用,这两个副作用相对于彼此未经过排序。

  • 在该表达式中,i - 2无论如何都不是您想要的索引,除非i为2,因为您在每次迭代时将i增加3。你最终会填补一些职位并跳过其他职位。

  • 您不会在复制到reduce_string的数据末尾添加空终结符。

  • 您的策略无论如何都不会导致复制文件的每个第三个字符;相反,它复制每行的每个第三个字符 。除非输入文件的所有行长度都是3的倍数,否则它们会有所不同。

答案 1 :(得分:2)

  

读取文件A,然后将内容复制到文件B.我想每隔三个字符写入文件B.

如果不重要,
阅读3个字符似乎很简单,写第3个字符。

for(;;) {
  fgetc(fileA);
  fgetc(fileA);
  int ch = fgetc(fileA);
  if (ch == EOF) break;
  fputc(ch, fileB);
}

int ch;
do {
  fgetc(fileA);
  fgetc(fileA);
  ch = fgetc(fileA);
} while (ch != EOF && fputc(ch, fileB) != EOF);

答案 2 :(得分:0)

最简单的方法是为每个数组使用不同的索引,这样每个数组都可以按照自己的速度运行。

int i,x;

for(i = 0, x=0; i < 1000; i+=3, x++)
{
    reduce_string[x] = full_string[i];
}
fprintf(fileB, "%s", reduce_string); 

答案 3 :(得分:-1)

我不会亲自使用fgets来读取整个文件并将每个第三个字节写入新文件。最好确定文件的长度,然后使用malloc分配一个大小的缓冲区,并将整个内容fread放入缓冲区:

fseek(ifp, 0, SEEK_END);
length = ftell(ifp);
rewind(ifp);

buffer = malloc(length + 1);

对于复制操作,这似乎是使用指针算法的一个很好的选择。

假设我们现有的char数组(我们要复制的数组)称为array1,长度为length,目标数组为array2。< / p>

size_t written = 0;
array2 = malloc(length); 
char *p = array1;
while(p <= (array1 + length)) 
{
     array2[written] = *p;
     written++, p+=3;
}

此代码运行完毕后,array2将包含array1的每个第三个元素,且长度为written

答案 4 :(得分:-2)

检查此代码。在您的代码中,您有reduce_string[i-=2] = full_string[i+=1]; - 我不知道您在哪里提出它,但这不起作用。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

 int main ()
 {
    int i;
    char full_string[100];
    char reduce_string[100];

    char file_name_for_read[128];
    char file_name_for_save[128];

    printf("Enter file name for read...\n");
    scanf ("%s", file_name_for_read);

    strcat(file_name_for_read,".txt");
    FILE *fileA;
    fileA=fopen(file_name_for_read,"r");

    printf("Enter file name for save...\n");
    scanf ("%s", file_name_for_save);

    strcat(file_name_for_save,".txt");
    FILE *fileB;
    fileB=fopen(file_name_for_save,"w");

    while(fgets(full_string, 50, fileA) !=NULL)
    {
         int cnt = 0;
        for(i = 2; i < strlen(full_string)-3; i+=3)
        {
            reduce_string[cnt++] = full_string[i];
        }
        fprintf(fileB, "%s", reduce_string);
    }

    fclose(fileA);
    fclose(fileB);

}