2014-10-17 47 views
0

我想从文本文件中读取非数字字,它可以用逗号,点,冒号或引号或这样的一些组合来分隔“。到目前为止,在读非数字的话 正确,但使用的fscanf离开delimiters.Am我()吧?使用fscanf()的格式化输入

int ReadWords(FILE* fp, char *words[]) 
{ 
    int i=0; 
    char temp[50],tmp[50]; // assuming the words cannot be too long 
    while (fscanf(fp,"%s%*[,.\":]",temp)==1) //ignore punctuation 
    { 
     if (isNumeric(temp)) 
      continue; 
     printf("%s\n",temp); 
     words[i] = strdup(temp); 
     i++; 
    } 
    fclose(fp); 
    // The result of this function is the number of words in the file 
    return i; 
} 

我越来越像输出

emergency," 
"an 
unknown 
car 
entered, 

我需要一个像

emergency 
an 
unknown 
car 
entered 
+0

请更新您的问题标题,以便更具体地了解您要区分的输入类型。 – 2014-10-17 06:59:28

回答

1

%s格式扫描 “字”,即,连续的非空间块。这包括标点符号。

您想扫描非数字字,即仅字母字符。您可以使用%[...]格式,你已经为标点符号做,这些字符:

while (fscanf(fp, "%49[a-zA-Z]%*[^a-zA-Z]", temp) == 1) ... 

注意事项:

  • 减号定义括号字符的范围,除非它是第一个或最后一个字符,所以%[a-zA-Z]扫描不带拉丁字母的字母。
  • 我已经在格式中添加了最大字长49,所以你不会溢出字符缓冲区。
  • 我将除字母之外的任何内容视为标点符号。这是一个简单的假设,但它将输入整齐地分为字母/标点符号序列。您可以将您希望包含的字母作为括号内的第一个字母否定字母^
  • 您应该首先对标点符号进行扫描(可能为空),以便真正的扫描以字母开头。
+0

谢谢..这实际上解决了我对项目的另一个困惑。 – Stormbringer 2014-10-17 07:04:11

0

原因是你在使用ignore子句之前正在使用标点符号。

尝试:"%[^,.\":]%*[,.\":]"

+0

不应该在某处存在字符串说明符吗? – Stormbringer 2014-10-17 06:40:40

+0

@Stormbringer这个,有两个 - '%['是一个字符串说明符。 – o11c 2014-10-17 06:42:55