[英]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
类型,则应将*str
为unsigned 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.