我想让fscanf在输入中使用空格来保持扫描

时间:2013-06-24 20:46:40

标签: c scanf

我得到了这句话:

fscanf(file, "%s %[^\t\n]", message);

现在当它扫描时,我得到所有的字符,直到空格,但我希望它读取直到行的结尾,而不是只有一个空格。

2 个答案:

答案 0 :(得分:1)

你所追求的并不完全清楚。如果您希望该行上的所有数据都到达换行符(并且您希望读取换行符),那么最简单的方法是使用fgets()

if (fgets(message, sizeof(message), file) != 0)
{
    size_t len = strlen(message);
    if (message[len-1] == '\n')
        message[len-1] = '\0';
    else
        ...line was too long to fit in message...
    ...use message...
}

如果您必须使用fscanf(),则可以使用:

char message[256];

if (fscanf(file, "%255[^\n]", message) == 1)
{
    int c;
    while ((c = getc(file)) != EOF && c != '\n')
        ;    // Ignore characters to newline
    ...use message...
}

在您的版本中,您至少有三个问题:

fscanf(file, "%s %[^\t\n]", message);
  1. 您必须转换指定的转换规范,但您只提供一个变量。
  2. 您不会检查fscanf()的返回值,因此您不知道它是否有效。
  3. 您的格式字符串不符合您的预期。
  4. 前两个问题相当简单。最后一个不是。 scanf()中的空格 - 族格式字符串表示白色空间的任意序列(扫描集内部除外)。因此,格式字符串中的空白将读取空白区域(空格,制表符,换行符等),直到输入中的某些内容与空白区域不匹配为止。这意味着出于多种目的的字母,数字或标点字符。然后,一系列此类字符将被读入您在修复问题1时提供的变量。

    #include <stdio.h>
    
    int main(void)
    {
      char msg1[256];
      char msg2[256];
      int  n;
    
      if ((n = scanf("%s %[^\t\n]", msg1, msg2)) == 2)
        printf("1: <<%s>>\n2: <<%s>>\n", msg1, msg2);
      else
        printf("Oops: %d\n", n);
      return 0;
    }
    

    示例运行:

    $ ./scan
    abracadabra
    
    
              widgets
    1: <<abracadabra>>
    2: <<sigets>>
    $
    

    如果您想要阅读message中的换行符(或标签符号),则需要:

    if (fscanf(file, "%[^\t\n]", message) != 1)
        ...oops...
    else
        ...use message...
    

答案 1 :(得分:-1)

在C中读取C String时,你应该使用gets family而不是scanf familly

char * gets ( char * str );

http://www.cplusplus.com/reference/cstdio/gets/?kw=gets

char * fgets ( char * str, int num, FILE * stream );

http://www.cplusplus.com/reference/cstdio/fgets/

这些读取直到找到EOL char或达到某个字符限制(为了不获得缓冲区溢出)

修改

以下是逐行读取整个文件的方法

while ( fgets ( line, size_of_buffer , file ) != NULL ){ /* read a line */
     fputs ( line, stdout ); /* write the line */
}

while循环中的条件确保文件没有结束。

如评论中所述,获取是一项非常危险的功能,不应使用。