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

时间:2010-01-29 09:48:12

标签: c pointers

我正在使用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);
        }
    }
}

谢谢!

5 个答案:

答案 0 :(得分:4)

你想要的是

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

答案 1 :(得分:1)

未修改str的值。试着改变

str+1;

str++;

答案 2 :(得分:0)

你应该使用

str = str+1;

可缩短为

str += 1;

甚至更好

++ str;
// here

更新指针str

答案 3 :(得分:0)

您的代码存在一些问题:

大多数情况下,您不希望在读取文件时在循环顶部执行检查feof(fp)。几乎可以保证,如果你这样做,你将read the last line of the file twice。这是因为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() *str不属于unsigned char,则while (isspace((unsigned char)(*str))) { 来电{@ 1}}

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

进行上述所有更改后,您的循环变为:

}

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

答案 4 :(得分:0)

要添加Kenny和Piere,因为他们已经提到str++++str,两者之间的差异是表达式中将使用哪个版本的str

例如

int y=1;
x[y++]=10;     //1
and x[++y]=10; //2
使用//1索引1中的

,并在x[1]之后y is 2//2 x[2]=10中分配++value,这意味着y在它之前递增用作索引。

通常,您希望在任何地方都使用value++。但是,正如我所说,{{1}}有其用途。