fscanf()只读入没有标点符号的字符

时间:2015-09-06 00:57:14

标签: c io scanf

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

#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]);,将整个句子作为一个单词。

如何更改它以获得正确的输出?

1 个答案:

答案 0 :(得分:1)

您可以接受分号,然后将其删除,如下所示:

在ptr [wordc]中存储单词之后

 var q1 = db.webpages_Roles
        .Join(
        db.webpages_GroupInRoles,
        r => r.RoleId,
        gr => gr.RoleID,
        (r, gr) => r)
        .Join(
        db.webpages_UsersInGroup.Where(x=>x.UserId==1),
        ug => ug.GroupID,
        gr=>gr.GroupID,
        (ug, gr) => ug); 

我没有测试过此代码,因此可能会出现拼写错误或其他内容。

或者你可以切换

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, "%s", ptr[wordc]);

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