使用c

时间:2019-04-30 00:18:35

标签: c

我在C中有一个赋值编码,试图使用C而不是shell从文件中删除前导空格。 我目前有一个程序,可以从程序中删除所有空格。我只是不知道如何使它仅在实际文本之前的行首删除空格。用c进行编码非常新,如果这是一个简单的问题,非常抱歉。我也将我的文件进行了硬编码,但我希望能够传递任何文本文件。 为了澄清起见,我仅尝试删除前导空格,并尝试从通过命令行传递的测试文件中删除前导空格。我没有使用字符串。


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

void main() {
   FILE *fp;
   char p;


   fp = fopen("mountainList.txt", "r");

   while((p=getc(input))!=EOF) {
     if(p != 32) 

   printf("%c",p);

   }
     fclose(input);

}


Example text file:

           this is a test file
    this is a file of text
              text is in this file
Example output:

this is a test file
this is a file of text
text is in this file

3 个答案:

答案 0 :(得分:1)

您快到了。循环中只需要更多代码即可。这是我的操作方法(您的编码风格可能有所不同,例如Yoda条件):

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

int main() {
   FILE *fp;
   int p;
   int at_start = 1;

   fp = fopen("mountainList.txt", "r");

   while (EOF != (p = getc(input))) {
     if (at_start && ' ' == p) continue;
     putc(p);
     at_start = ('\n' == p);
   }
   fclose(input);
}

答案 1 :(得分:0)

#include <ctype.h>
#include <string.h>
#include <stdio.h>

char *trimLeading(char line[])
{
    char *p;

    for (p = line; *p && isspace(*p); ++p) ;

    return p;
}

void printTrimmedLns(FILE *fp)
{
    char line[MAXLINE];

    while (fgets(line, MAXLINE, fp))
        printf("%s", trimLeading(line));
}

这样致电:

printTrimmedLns(stdin); /* or whatever input stream you need */

答案 2 :(得分:0)

关于编码的一些注意事项。请勿使用硬编码的文件名或数字(称为“魔术数字” ),例如

fp = fopen("mountainList.txt", "r");
...
if(p != 32)

它们使您的代码难以阅读,更重要的是,随着程序长度的增加,它们难以维护。而是将文件名作为参数传递给程序,或者从代码中读取文件名。代替使用魔数 32,而使用字符文字' '可以清楚地表明空格是必需的。

如果需要数字常量或字符串常量,请在代码的开头#define。如果以后需要更改,则可以提供一个方便的位置来进行单个更改。

虽然使用getcfgetc)没什么问题,但请考虑使用面向 line _ 的输入函数一次读取一行输入,例如fgets()或POSIX getline()。然后,您可以使用字符串函数,这些函数可以自动报告必须删除的空白字符的数量。

除了检查每个字符并保留索引或使指针前进之外,您还可以调用strspn,提供包含行的缓冲区,然后是定义要考虑的空白字符的字符串,它会返回行中完全由空格组成的初始字符数。

例如,以下内容将文件名作为程序的第一个参数读取(或者,如果没有给出文件名,则默认情况下从stdin读取),然后在验证之后打开以供读取,一次读取一行,并将行与包含空格字符strspn的字符串(空格,制表符)一起传递到" \t"strspn的返回是完全由空格字符串中的字符组成的初始字符数-然后,您可以将其用作偏移量(或索引)来打印行,省略前导空格,例如

#include <stdio.h>
#include <string.h>

#define MAXC 1024       /* if you need a constant, #define one (or more) */
#define WS " \t"        /* leading whitespace characters to remove */

int main (int argc, char **argv) {

    char line[MAXC];    /* buffer to hold line (don't skimp on buffer size) */
    /* use filename provided as 1st argument (stdin by default) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    while (fgets (line, MAXC, fp))                  /* read each line */
        printf ("%s", &line[strspn (line, WS)]);    /* output w/o leading ws */

    if (fp != stdin) fclose (fp);   /* close file if not stdin */

    return 0;
}

或者,如果您更喜欢使用指针和偏移量进行打印,则可以将对printf的调用替换为:

        printf ("%s", line + strspn (line, WS));    /* output w/o leading ws */

注意:如果要删除包含所有空格的行,请检查由strspn返回的偏移量处的行尾,然后跳过打印行)

使用示例输入将导致以下结果:

$ /bin/removews <dat/wslines.txt
this is a test file
this is a file of text
text is in this file

如开头所述,采用面向字符的方法以getc来读取文件并没有错,但是知道 line-的另一种选择-面向的方法将整行读入缓冲区可以使string.h中的函数可用于缓冲区本身。

仔细检查一下,如果还有其他问题,请告诉我。