扫描名称和奇怪的字符串:文件

时间:2019-04-14 17:54:25

标签: c arrays file char

我正在做一个分配工作,以对文本文件内的列表中的名称进行排序。我正在使用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;
}

2 个答案:

答案 0 :(得分:0)

在循环中,您将所有字符复制到空格,但不要将终止的'\ 0'字符写入ClassGroup1.firstName。因此,在打印时,将在名称之后打印所有垃圾,直到内存中的第一个0x00字符为止。

另外,从此代码段来看,fget中的11个可能应该为SIZE。休息会比goto更好。

答案 1 :(得分:0)

以下建议的代码:

  1. 执行指示的功能
  2. 干净地编译
  3. 正确检查错误
  4. 删除未使用的语句

现在,建议的代码:

#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;
}