2015-09-06 27 views
0

我想从文本文件(在命令行中指定为参数的名称)的某些词语(在此示例中为前20)中读取它。由于下面的代码运行,我发现它也带有带有字符的标点符号。fscanf()仅读入没有标点符号的字符

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(int argc, char * argv[]){ 
int wordCap = 20; 
int wordc = 0; 
char** ptr = (char **) calloc (wordCap, sizeof(char*)); 
FILE *myFile = fopen (argv[1], "r"); 
if (!myFile) return 1; 
rewind(myFile); 
for (wordc = 0; wordc < wordCap; wordc++){ 
    ptr[wordc] = (char *)malloc(30 * sizeof(char)); 
    fscanf(myFile, "%s", ptr[wordc]); 
    int length = strlen(ptr[wordc]); 
    ptr[wordc][length] = '\0'; 
    printf("word[%d] is %s\n", wordc, ptr[wordc]); 
} 
return 0; 
} 

当我穿过了一句:“有一次,当狮子睡着了一点点鼠标就开始和看不起他跑起来;”,“他”将用分号接踵而至。

我将fscanf()更改为fscanf(myFile, "[a-z | A-Z]", ptr[wordc]);,它将整个句子作为单词。

我怎样才能改变它,使正确的输出?

+0

您指定的扫描集接受小写字母,大写字母,空格和管道符号。不要包括空白,特别是;你并不是真的想要这个管道,尽管它会损失很少。不要忘记,你必须使用别的东西来读取终止扫描集的字符。 –

回答

1

你可以接受分号,然后将其删除后,像这样:

你存储的字PTR [wordc]后:

i = 0; 
while (i < strlen(ptr[wordc])) 
{ 
    if (strchr(".;,!?", ptr[wordc][i])) //add any char you wanna delete to that string 
     memmove(&ptr[wordc][i], &ptr[wordc][i + 1], strlen(ptr[wordc]) - i); 
    else 
     i++; 
} 
if (strlen(ptr[wordc]) > 0) // to not print any word that was just punctuations beforehand 
    printf("word[%d] is %s\n", wordc, ptr[wordc]); 

我没有测试过这代码,所以可能存在拼写错误或其他内容。

或者你可以为

fscanf(myFile, "%29[a-zA-Z]%*[^a-zA-Z]", ptr[wordc]); 

只捕获字母切换

fscanf(myFile, "%s", ptr[wordc]); 

。 29限制字的大小,所以你不会溢出,因为你只分配了30个字符的大小

+0

谢谢。这绝对是一种策略,但我正在寻找替代'%s'的行,或者一个证明它不可行的答案。 – jsh6303

+0

@JiajuShen我加了一些信息 – dietbacon

相关问题