为什么我的 strcpy() 不覆盖整个字符串并保留最后一个 char [] 中的字符?

Why is my strcpy() not overwriting the whole string and keeping characters from the last char []?

我有一个简单的方法,它接受一个文件名和一个指向链表的指针。链表似乎没有任何问题。但是,我注意到由于某种原因,strcpy 似乎无法覆盖曾经存在的字符串。每次我覆盖 char 数组时,副本都会变得越来越糟。 为什么 strcpy 保留以前的数据?

void readFile(struct record ** recordArray, char inputArray [])
{

struct record ** temp = recordArray;
char theString [100];
char characterInput;
int counter = 0;
counter  = 0;
FILE * infile = fopen(inputArray, "r");

char name [100];
char address [100];
int yearofbirth;
char telno [20];

int target = 0;
/*
0 name
1 address
2 yearofbirth
3 telno
*/

/*If the file exists*/
if (infile != NULL)
{ 
   while (characterInput != EOF)
   {
        characterInput = fgetc(infile);

        if (characterInput == '\n')
        {
            theString[counter] = '[=10=]';

            if (target == 0)/*name*/
            {
                strcpy(name, theString);
                counter = 0;
                target++;
            }
            else if (target == 1) /*address*/
            {
                strcpy(address, theString);
                counter = 0;
                target++;
            }
            else if (target == 2) /*yearofbirth*/
            {
                yearofbirth = atoi(theString);
                counter = 0;
                target++;
            }
            else if (target == 3) /*telephone number*/
            {
                strcpy(telno, theString);
                counter = 0;
                target = 0;
                addRecord(temp, name, address, yearofbirth, telno);
            }
        }
        else /*if the character is not a null line ie its a regular character*/
        {
          theString[counter] = characterInput;  
          counter++;   
        }
   } 
}
else
{
    printf("Error: There has to be a file named: %s\n", inputArray);
}
fclose(infile);

}

输入:

bill
firstaddress
9119398644
1993

tim
birch st.
7567115
1980

roger
wood st drive
4830382
1909

输出:

Name: bill
Address: firstaddress
Birthyear: 529464052
Telephone Number: 1993398644ss

Name: tim3398644ss
Address: birch st.4ss
Birthyear: 7567115
Telephone Number: 1980115t.4ss

Name: timmy15t.4ss
Address: wood st drive
Birthyear: 4830382
Telephone Number: 1909382 drive

编辑:

这是最终有效的代码。谢谢大家。

void readFile(struct record ** recordArray, char inputArray [])
{

struct record ** temp = recordArray;
char theString [100];
char characterInput;
int counter = 0;
counter  = 0;
FILE * infile = fopen(inputArray, "r");

char name [100];
char address [100];
int yearofbirth;
char telno [20];

int target = 0;
/*
0 name
1 address
2 yearofbirth
3 telno
*/

/*If the file exists*/
if (infile != NULL)
{ 
   while (characterInput != EOF)
   {
        characterInput = fgetc(infile);

        if (characterInput == '\n')
        {
            theString[counter] = '[=13=]';

            if (target == 0)/*name*/
            {
                strcpy(name, theString);
                counter = 0;
                target++;
            }
            else if (target == 1) /*address*/
            {
                strcpy(address, theString);
                counter = 0;
                target++;
            }
            else if (target == 2) /*yearofbirth*/
            {
                yearofbirth = atoi(theString);
                counter = 0;
                target++;
            }
            else if (target == 3) /*telephone number*/
            {
                strcpy(telno, theString);
                counter = 0;
                target = 0;
                addRecord(temp, name, address, yearofbirth, telno);
            }
        }
        else /*if the character is not a null line ie its a regular character*/
        {
          theString[counter] = characterInput;  
          counter++;   
        }
   } 
}
else
{
    printf("Error: There has to be a file named: %s\n", inputArray);
}
fclose(infile);
}

您需要用 '[=12=]'.

终止输入字符串

变化:

    if (characterInput == '\n')
    {
        if (target == 0)/*name*/
        {
            ...

至:

    if (characterInput == '\n')
    {
        theString[counter] = '[=11=]';  // terminate input string

        if (target == 0)/*name*/
        {
            ...
void readFile(struct record ** recordArray, char inputArray []){

    struct record ** temp = recordArray;
    char theString [100];
    char characterInput;
    int counter = 0;
    counter  = 0;
    FILE * infile = fopen(inputArray, "r");

    char name [100];
    char address [100];
    char yearofbirth[100];
    char telno [100];

    char *buff=name; // initially is the name
    int target = 0;
    /*
    0 name
    1 address
    2 yearofbirth
    3 telno
    */



    if (!infile)
    {
        printf("Error: There has to be a file named: %s\n", inputArray);
        return;
    }
    char lastChar=0;
   while (characterInput != EOF)
   {
        characterInput = fgetc(infile);


        if (characterInput == '\n')
        {
            if(lastChar==characterInput)
                continue; /*empty line*/

            target++;
            target%=4;
            *buff=0; // null terminate the string
            switch(target){
                case   0:/*name*/
                    addRecord(temp, name, address, atoi( yearofbirth), telno);
                    buff=name;
                    break;
               case 1: /*address*/
                    buff=address;
                    break;
               case 2: /*yearofbirth*/
                    buff=yearofbirth;
                    break;
               case 3: /*telephone number*/
                    buff=telno;

                }
        }
        else /*if the character is not a null line ie its a regular character*/
        {
          *buff = characterInput;  
          buff++;   
        }
        lastChar=characterInput;
   } 


    fclose(infile);

    if(buff!=name) // last record?
        addRecord(temp, name, address,atoi( yearofbirth), telno);
}