我正在使用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);
}
}
}
谢谢!
答案 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}}有其用途。