我正在做一个分配工作,以对文本文件内的列表中的名称进行排序。我正在使用CodeBlocks v17.12。我要求代码读取文件上的名字(在这种情况下恰好是Hamza),当它看到空格时应停止。但是,一旦我在CodeBlocks中编译它,它就会吐出:Hamza uyªn<■ ║kDu¡lDu``@
有人知道这个问题是什么吗?我不能在那儿买,因为以后我需要对名字进行排序。
{
fPointerOne = fopen("DT265A.txt", "r");
fPointerTwo = fopen("DT265C.txt", "r");
fPointerThree = fopen("DT265B.txt", "r");
fPointerFour = fopen("DT8900.txt", "r");
fgets(firstNames, 11, fPointerOne);
for (i = 0; i < SIZE; i++) {
ClassGroup1.firstName[i] = firstNames[i];
if (firstNames[i] == ' ') {
goto PRINT;
}
}
PRINT:
printf("%s", ClassGroup1.firstName);
fclose(fPointerOne);
fclose(fPointerTwo);
fclose(fPointerThree);
fclose(fPointerFour);
return 0;
}
答案 0 :(得分:0)
在循环中,您将所有字符复制到空格,但不要将终止的'\ 0'字符写入ClassGroup1.firstName。因此,在打印时,将在名称之后打印所有垃圾,直到内存中的第一个0x00字符为止。
另外,从此代码段来看,fget中的11个可能应该为SIZE。休息会比goto更好。
答案 1 :(得分:0)
以下建议的代码:
现在,建议的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAMES 100
#define MAX_NAME_LEN 30
#define MAX_BUFFER_LEN 1024
struct CLASS_GROUP
{
char firstName[ MAX_NAME_LEN ];
};
int main( void )
{
struct CLASS_GROUP ClassGroup1[ MAX_NAMES ] = {'\0'};
char inputBuffer[ MAX_BUFFER_LEN ];
FILE *fPointerOne = fopen("DT265A.txt", "r");
if( !fPointerOne )
{
perror( "fopen to read DT265A.txt failed" );
exit( EXIT_FAILURE );
}
//FILE *fPointerTwo = fopen("DT265C.txt", "r");
//FILE *fPointerThree = fopen("DT265B.txt", "r");
//FILE *fPointerFour = fopen("DT8900.txt", "r");
int i = 0;
while( i < MAX_NAMES && fgets( inputBuffer, sizeof( inputBuffer ) , fPointerOne) )
{
char * token;
if( (token = strtok( inputBuffer, " " )) )
{
strcpy( ClassGroup1[i].firstName, token);
}
i++;
}
printf("%s", ClassGroup1[0].firstName);
fclose(fPointerOne);
// fclose(fPointerTwo);
// fclose(fPointerThree);
// fclose(fPointerFour);
return 0;
}