【问题标题】:Printing out char array, a tab takes up 3 spaces打印出char数组,一个tab占3个空格
【发布时间】:2017-09-25 02:59:22
【问题描述】:

我正在阅读以下 data.txt 文件:

b    1
b    2
b    3
b    4

这是一个中间标签

我有下面的代码来打印出来,一行一行,然后一个字符一个字符。

#include <stdio.h>
#include <stdlib.h>

int printCharArray(char *arr);

int main(int argc, char * argv[]){
    FILE * filePointer;
    filePointer = fopen("data.txt", "r");
    char singleLine[32]; 

    while(!feof(filePointer)){
        fgets(singleLine, 32, filePointer);
        printCharArray(singleLine);
    }

    fclose(filePointer);
    return 0;
}

int printCharArray(char *arr){
    int length = 5;
    printf("\n");

    int i = 0;
    for(i=0;i<length;++i){
        printf("%c, ", arr[i]);
    }
    printf("DONE PRINTING \n");

    return 0;
}

让我困惑的是它打印出来的内容:

b,  ,  ,  , 1, DONE PRINTING 

b,  ,  ,  , 2, DONE PRINTING 

b,  ,  ,  , 3, DONE PRINTING 

b,  ,  ,  , 4, DONE PRINTING 

我不明白字母和数字之间有 3 个空格。如果都是字符,tab不应该只有一个空格吗?

【问题讨论】:

  • 确保您在 data.txt 中确实有制表符,而不是空格...
  • stackoverflow.com/questions/29476556/… 这可能会有所帮助..
  • @JamesMitchell 您的编辑器可能将您的制表符转换为空格。
  • 您的输出表明输入文件不包含您认为它包含的内容。事实上,您应该使用十六进制转储程序或等效程序来显示文件中的内容。您对函数中的行长做出了一些可疑的假设。 (您可以将打印修改为:printf("(%d) %c, ", arr[i], arr[i]); 以查看数字字符值是什么。)

标签: c file fopen fgets


【解决方案1】:

这是对您的代码进行清理后的最小调整,如我的 comment 中所建议的那样具有更好的打印效果。

代码

#include <stdio.h>

void printCharArray(char *arr);

int main(void)
{
    char filename[] = "data.txt";
    FILE *filePointer = fopen(filename, "r");
    if (filePointer == NULL)
    {
        fprintf(stderr, "Failed to open file '%s' for reading\b", filename);
        return(1);
    }

    char singleLine[32];

    while (fgets(singleLine, sizeof(singleLine), filePointer) != 0)
        printCharArray(singleLine);

    fclose(filePointer);
    return 0;
}

void printCharArray(char *arr)
{
    printf("\n");
    for (int i = 0; arr[i] != '\0'; ++i)
        printf("(%d) %c, ", arr[i], arr[i]);
    printf("DONE PRINTING\n");
}

以下是两个版本的数据文件的输出,一个带有声明的制表符,一个带有空格。

空格

请注意,数据是从问题中复制而来的。字母和数字之间有 4 个空格。该代码还打印换行符;修改它以在换行符或空字节处停止会很容易。

(98) b, (32)  , (32)  , (32)  , (32)  , (49) 1, (10) 
, DONE PRINTING

(98) b, (32)  , (32)  , (32)  , (32)  , (50) 2, (10) 
, DONE PRINTING

(98) b, (32)  , (32)  , (32)  , (32)  , (51) 3, (10) 
, DONE PRINTING

(98) b, (32)  , (32)  , (32)  , (32)  , (52) 4, (10) 
, DONE PRINTING

标签

(98) b, (9)     , (49) 1, (10) 
, DONE PRINTING

(98) b, (9)     , (50) 2, (10) 
, DONE PRINTING

(98) b, (9)     , (51) 3, (10) 
, DONE PRINTING

(98) b, (9)     , (52) 4, (10) 
, DONE PRINTING

【讨论】:

  • 好的,它看起来像是在打印空间。话虽如此,如果我在制作时确实使用了标签,如何确保它们是我的 data.txt 文件中的标签?
  • 这取决于您的平台和编辑器。您是在使用 vim 或其他方式的类 Unix 系统上吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 2021-02-01
  • 2021-01-13
相关资源
最近更新 更多