为什么我的 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);
}
我有一个简单的方法,它接受一个文件名和一个指向链表的指针。链表似乎没有任何问题。但是,我注意到由于某种原因,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);
}