sscanf读取到字符串末尾

时间:2019-05-14 19:22:44

标签: c scanf

我需要将字符串分成两部分,字符串的第一列是第一部分,字符串的其余部分是第二部分。第一部分需要存储在first_str中,第二部分需要存储在rest_str中。

我正在使用sscanf来获得结果,当sentence[]不包含任何文字\n时,通过以下示例设法获得了所需的输出。

简而言之,我需要知道格式说明符,直到输入字符串的结尾。直到现在\n为止,我一直可以使用它,但是现在无法使用了。有人可以帮助阅读直到字符串的末尾,而不是直到看到\n

此处按比例缩小示例:

#include <stdio.h>

int main ()
{
  char sentence []="abc@xyz.com foo bar foobar\nhey there";
  char first_str [200];
  char rest_str [200];

  //sscanf (sentence,"%s %99[^\0]",first_str,rest_str);
  sscanf (sentence,"%s %99[^\n]",first_str,rest_str);

  printf ("first column is %s\nevertyhing else is %s\n",first_str,rest_str);

  return 0;
}

所需结果:

first column is abc@xyz.com
evertyhing else is foo bar foobar\nhey there

OR

first column is abc@xyz.com
evertyhing else is foo bar foobar
hey there

2 个答案:

答案 0 :(得分:2)

sscanf支持%n格式说明符,以返回消耗的字符数。您可以使用它来确定sscanf消耗了前缀多长时间。

以下代码将rest_str设置为指向“字符串的其余部分”:

int main ()
{
  char sentence []="abc@xyz.com foo bar foobar\nhey there";
  char first_str [200];
  char *rest_str;

  int n = 0;
  sscanf (sentence,"%s %n",first_str,&n);
  rest_str = sentence + n;

  printf ("first column is %s\nevertyhing else is %s\n",first_str,rest_str);

  return 0;
}

答案 1 :(得分:2)

  1. 查找字符串中分隔符的首次出现。分隔符是分隔符一词,在您的情况下为空格。但是很容易将算法扩展到包括列表,换行符,换页符等。
  2. 在此处打印空字节。
  3. 第一列从句子的开头开始,直到写入的空字节为止。第二列在分隔符之后开始。

下面的代码产生预期的输出:

linetest = ["my-ldap01","my-ldap02","my-ldapdc01", "my-ldapdc02"]

if line not in linetest:
    Flag = True