【问题标题】:Sscanf Problems with CC 的 Sscanf 问题
【发布时间】:2017-06-03 12:36:15
【问题描述】:

您好,我遇到了sscanf 的问题。我只是想写一个简单的测试程序来帮助我理解它是如何工作的。使用sscanf 写入不同的变量时会出现问题。以下是他们的价值观:

IP=175.85.10.147

数字=2589

电子邮件 = edward@gmail.com

 #include <stdio.h>
 #include <stdlib.h>

 int main() {
     char *toSend = "175.85.10.147:2589:edward@gmail.com";
     int *number;
     char IP[200];
     char email[300];
     sscanf(toSend, "%[^:]: %i%[^:]: ", IP, number, email);
     printf("%s", IP);
     printf("%i", number);
     printf("%s", email);
     return 0; 
 }

它打印的 IP 正确。

数字打印不正确,这可能与我在编译时收到的警告有关:format '%i' expects argument of type 'int' but argument 2 has type 'int *'

email 变量出于某种原因只包含奇怪的字符。

【问题讨论】:

  • 您将指向 int 的指针作为参数传递给在该位置采用 int 的函数。从变量声明中删除*,使其读取int number;,看看是否有效。
  • 好吧,让我们先处理警告。 %i 需要 int,而你给它的是 number,即 int*
  • int *number; --> int number;, sscanf(toSend,"%199[^:]: %i:%299s", IP, &amp;number, email);
  • 0100 的意思是六十四,对吧?如果你不同意使用%d 而不是%i
  • @Jasen:你是%i 会神奇地parse 0 prefixed numbers as octal

标签: c printf scanf


【解决方案1】:

你需要一些内存来存储数字

即改变

int *number;

int number;

然后使用

 sscanf(toSend,"%[^:]:%i:%[^:]",IP, &number, email);

我还纠正了错别字 - 这是代码http://ideone.com/hpqGDZ

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(){
  char *toSend = "175.85.10.147:2589:edward@gmail.com";
  int number;
  char IP[200];
  char email[300];
  if (sscanf(toSend, "%199[^:]:%i:%299[^:]", IP, &number, email) != 3) {
     return 1;
  }
  printf("%s\n", IP);
  printf("%i\n", number);
  printf("%s\n", email);
  return 0; 
}

【讨论】:

  • 我不认为传递对number 的引用是正确的,那仍然会有int* 的类型,不是吗?
  • @ArnauVanBoschkenArnauB - 请使用 BLUEPIXY sscanf 与避免缓冲区溢出的增强功能
  • 是的 - 我自己也是这么想的。 - 更新了答案。不确定断言是否是最好的方法 - 但它会做
  • assert 应该只用于调试运行。它旨在在发布版本中编译为空。所以 N = scanf(...) assert(N ==3) 很好,但不能包装调用。
  • %i 之前的空格是多余的。绝对没有理由让它在那里。
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多