【问题标题】:Error in printing out the data obtained in pointer to character strings打印出字符串指针获取的数据时出错
【发布时间】:2011-05-18 04:27:52
【问题描述】:

我正在尝试调用接口函数并打印出结果值。函数原型包含指向字符串的指针作为参数。当我打印出结果值时,我收到了一些奇怪的符号。我下面的方法正确吗?

int interfacecall(char *a, char *b ...);

char * a= "Testdata";
char b [4098];

result= interfacecall(a,b);

//different value is returned in b via function implementation in a third party dll.

printf(b);

【问题讨论】:

  • 好吧,为此我们需要知道 interfacecall 实际做了什么...
  • interfacecall 是做什么的?另外,试试char a[] = "Testdata";
  • 另外,char * a = "literal" 已被弃用,请使用const char* a = "literal"char a[] = "literal"
  • @Xeo:您​​有关于将字符串文字地址不推荐地分配给指向 char 的指针的参考吗?或者您的意思是它在C++ 中已被弃用?我相信如果您尝试将字符串文字(const char [] 类型)分配给指向 char 的指针(char *C 中,所有C++ 编译器都必须抱怨,字符串文字的类型为@987654333 @.
  • @pmg: 嗯,忽略了那个 lil c 标签......那么,我的最后一条评论只适用于 C++ :)

标签: c++ c pointers dll printf


【解决方案1】:

你的 printf 不是那么安全。应该是:

printf("%s", b);  //corrected - safe!

在C++中,你也可以使用std::cout作为:

std::cout << b; //its simpler - must include<iostream>

确保b 是一个以null 结尾的c 字符串,否则它会打印垃圾并可能使您的程序崩溃。以 Null 结尾的字符串意味着它必须以 \0 结尾。像这样的:

b[slen] = '\0'; //you may have to do this explicitly!

【讨论】:

  • 嗯,你可以直接打印,不用格式字符串。这样做并不是很省钱,因为可能会注入各种恶作剧的代码。
  • 我尝试使用以空字符结尾的字符串,但打印出来时出现垃圾。假设我分配了一个大小为 5000 的数组。如果返回的数据仅填充到 2000 ,并且我在 4999 处添加了一个空值,是否会导致打印垃圾数据?
  • @vij:那么如果你不发布代码,我应该如何帮助你?
  • @vij:是的。从2001到4998都是垃圾!
  • 字符错误[4097];result= callInterface(a, error,....);error[sizeof(error)-1]='\0';printf(error);跨度>
猜你喜欢
  • 2011-09-17
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多