使用C的字符串分隔符

问题描述:

我已经开始学习如何使用字符串,但是我对整个概念有点困惑。我试图从包含字符串的文件逐字读取。使用C的字符串分隔符

以下是文件:

Row, row, row your boat, 
Gently down the stream. 
Merrily, merrily, merrily, merrily, 
Life is but a dream. 

我的方法是使用

char hold[25]; 

// Statement 
while(fscanf(fpRow, "%s", hold) != EOF) 
    printf("%s %d\n", hold, strlen(hold)); 

所以,我的任务是读取每个字符串,并排除所有的,和。在文件中。为此,该方法将使用%[^ ,.]而不是%s正确吗?但是当我尝试这种方法时,我的字符串只想读取文件的第一个单词,循环永远不会退出。有人可以向我解释我做错了什么吗?另外,如果问fscanf和fgets之间的意义是不是太大了?由于

while(fscanf(fpRow, "%24[^,.\n ]", hold) != EOF) 
{ 
    fscanf(fpRow, "%*c", hold); 
    printf("%s %d\n", hold, strlen(hold)); 
} 
+0

你的意思是'fgetc()'?这只能读取一个字符,而'fscanf()'可以读取更多,也可以转换为其他数据类型。 – 2013-02-17 22:55:05

+0

我总是希望使用'fgets'来获得一整行,并在循环中单独处理它。它确定你最终可以进入FEOF;如果你没有完成扫描一行,我不知道'fscanf'会为你自己表现,如果你没有用格式说明符来到行尾...... – Floris 2013-02-17 22:57:34

+0

@ Code-Guru-啊,对不起,它应该是'fgets'。对不起,我现在编辑它。 – Nathan 2013-02-17 23:04:54

是,%[^,. ]应该工作 - 但请记住,当你这样做,就会停止阅读时遇到的任何这些字符。然后您需要在输入缓冲区中读取该字符,然后再尝试读取另一个字。

另外请注意,当您使用%s%[...],你想指定缓冲区的长度,或者你最终的东西基本上是喜欢gets,其中从用户输入错误可/会导致缓冲区溢出。

+3

男人,我做了很多C编程已经有一段时间了。从什么时候scanf()使用正则表达式? – 2013-02-17 22:53:29

+1

'%* [^ ,. ]'会“跳过”任何匹配的内容,所以你不需要将它读入一个变量中...... – Floris 2013-02-17 22:53:30

+1

@ Code-Guru - 参见http://*.com/questions/5999164/is-scanfs-regex- support-a-standard – Floris 2013-02-17 22:55:16