我在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
答案 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
。如果以后需要更改,则可以提供一个方便的位置来进行单个更改。
虽然使用getc
(fgetc
)没什么问题,但请考虑使用面向 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
中的函数可用于缓冲区本身。
仔细检查一下,如果还有其他问题,请告诉我。