sscanf 读取直到字符串末尾

mon*_*onk 3 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;
}
Run Code Online (Sandbox Code Playgroud)

期望的结果:

first column is abc@xyz.com
evertyhing else is foo bar foobar\nhey there
Run Code Online (Sandbox Code Playgroud)

或者

first column is abc@xyz.com
evertyhing else is foo bar foobar
hey there
Run Code Online (Sandbox Code Playgroud)

ybu*_*ill 5

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果“sscanf”有返回值检查,我会睡得更好。 (5认同)
  • @melpomene:为什么不呢?如果您知道它的作用,就没有理由不这样做。 (3认同)
  • @melpomene:嗯,这是你的个人观点,没有任何事实支持。在某些情况下,“strncpy”正是工作所需的(尽管坦率地说,本例中不需要“用零填充”行为)。无论哪种情况,这个问题和这个答案都是偏离主题的。 (3认同)
  • @monk `n` 是 `%s` 提取到 `first_str` 的字符串的字符数。所以 `sentence + n` 是一个指向句子“其余部分”开头的指针。 (2认同)