【问题标题】:Scanning Names and weird Strings: Files扫描名称和奇怪的字符串:文件
【发布时间】:2019-09-04 19:03:45
【问题描述】:

我正在执行一项任务,以对位于文本文件内的列表中的名称进行排序。我正在使用 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;
}

【问题讨论】:

  • 我有理由确定您的代码没有向ClassGroup1.firstName 添加空终止符,这使得printf("%s", ClassGroup1.firstName);exhibit 未定义行为
  • 我认为你需要使用 fflush(stdin) 即清除缓冲区
  • 另外goto 是绝对没有必要的,只需使用break
  • @UnholySheep 你是对的
  • 假设您在ClassGroup1.firstName 中仍有可用空间(我无法确定,因为您没有提供minimal reproducible example),您可以在ClassGroup1.firstName[i + 1] = '\0' 中添加if跨度>

标签: c arrays file char


【解决方案1】:

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

此外,fgets 中的 11 可能应该是此代码 sn-p 中的 SIZE。休息会比 goto 更好。

【讨论】:

    【解决方案2】:

    以下建议的代码:

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

    【讨论】:

      猜你喜欢
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多