繁体   English   中英

用C中的字符数组忽略前导空格

[英]Ignoring leading whitespace with character array in C

我正在使用fgets函数从文件中读取一行。 我不明白如何忽略文件的开头空格。 我以为如果有一个char数组,我可以检查第一个值,看它是否是带isspace的空格,然后递增到下一个值。 我的代码如下:

while (!feof(fp)) {
        fgets(str, LINE_SIZE, fp);
        while (isspace(*str)) {     // need help 
            str + 1;        // here
        }


        for (cp = str; cp = strtok(cp, "AEIOUaeiou\n"); cp = NULL) {
            puts(cp);
        }
    }
}

谢谢!

你想要的是像

while (!feof(fp)) {
        fgets(str, LINE_SIZE, fp);
        char * tmp = str; //use a temporary variable so str pointer isn't overwritten
        while (*tmp && isspace(*tmp)) {     // need help 
           tmp++;        // here
        }


        for (cp = tmp; cp = strtok(cp, "AEIOUaeiou\n"); cp = NULL) {
            puts(cp);
        }
    }
}

str的值未修改。 尝试改变

str+1;

str++;

你应该用

str = str+1;

可以缩短为

str += 1;

甚至更好

++ str;

// here更新指针str

您的代码存在一些问题:

大多数时候,您不想在读取文件时在循环的顶部执行检查feof(fp) 几乎可以保证,如果这样做,您将两次读取文件的最后一行 这是因为feof()仅在较早的读取尝试导致“文件结束”时才返回true。 更好的方法是检查fgets()返回NULL

while (fgets(str, LINE_SIZE, fp) != NULL) {
    /* do your processing */
}
if (ferror(fp)) { /* there was an error reading some data */ }

如果您的isspace()调用不是unsigned char类型,则应将*strunsigned char

while (isspace((unsigned char)(*str))) {

要使用isspace() ,您应该#include <ctype.h>


您需要增加str 您的表达式str+1评估str+1 ,舍弃其值,并且不执行任何操作。 因此,您需要:

++str;

但是您不想增加str :下一个fgets()调用需要它。 因此,您应该将其复制到一个临时指针:

char *tmp = str;
while (isspace((unsigned char)(*tmp))) {
    ++tmp;
}

进行以上所有更改,您的循环将变为:

while (fgets(str, LINE_SIZE, fp) != NULL) {
    char *tmp = str;
    while (isspace((unsigned char)(*tmp)))
        ++tmp;

    for (cp = tmp; cp = strtok(cp, "AEIOUaeiou\n"); cp = NULL) {
        puts(cp);
    }
}

(您有一个额外的结束} ,很可能是复制粘贴错误。)

由于Kenny和Piere提到过str++++str ,因此要加进去,两者之间的区别是表达式中将使用哪种版本的str

例如

int y=1;
x[y++]=10;     //1
and x[++y]=10; //2

//1索引1被使用, x[1]被赋值为10,之后y is 2//2 x[2]=10意味着y在被用作索引之前已经增加。

通常,您想在任何地方使用++value 但是,正如我所说明的那样, value++有其用途。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM