我需要一些帮助来纠正这个代码,因为它会打印出一些奇怪的东西。
我使用无线工具和iwlib.h扫描无线网络并获取他们的ESSID。当我使用:
printf("Network name %s:", result->b.essid);然后,它就像一个魅力,并打印出我的名字。但是,我希望将其转换为char,以便以后可以通过网络通过缓冲区发送它。
(除非我可以发送结果,并且“名称提取”可以发生在另一边?那不可能吗?)
请参阅下面的示例代码(不是完整的代码),说明我是如何尝试这样做的,但结果是我得到了真正随机的字符。
wireless_scan_head head;
wireless_scan *result;
iwrange range;
while(result != NULL)
{
char *network;
network = result->b.essid;
int k;
int size = strnlen(result->b.essid);
printf("\n Network ESSID:");
for(k=0; k<=size; k++)
{
printf("%c", network[k]);
k++;
}
result = result->next;
}谢谢你的帮助!
发布于 2013-07-24 20:35:08
只是为了正规化..。
您将在for循环中以及for声明中递增。输出所有其他字符,并实际阅读超出了network[]的界限。(你说你很累.这样就行了!)
另外,您使用的是strnlen函数,但没有指定最大长度。I强建议始终使用-Wall -Wextra进行编译,并可能使用-Wunused来显示问题。要特别挑剔,也要使用-Werror,修复所显示的警告和错误,您将编写更好的代码并养成更好的习惯。
另外,如果可以使用strlen (或strnlen)函数来确定长度,则循环是多余的。一个简单的:(正如你最初指出的)
printf("Network ESSID: %s\n", result->b.essid);就够了。
essid可能在结构中被定义为'char essidxx;‘或(更好的) ' char * essid;',这意味着它已经是char字符串了。(C中的“char”是而不是,其存储方式与C++中的“string”相同)
{Grin}如果您真的想这样写它:
while (result != NULL) {
char *network = result->b.essid;
/* string length is unsigned */
size_t size = strlen(network);
/* so we need an unsigned index to compare */
unsigned int k;
/* initial part of output */
printf("Network ESSID: ");
for (k = 0; k <= size; ++k) {
/* printf is overkill for a single char */
putchar(network[k]));
}
/* terminating CR/LF/CRLF, printf overkill again */
puts(NULL);
result = result->next;
}简短的版本:
while (result != NULL) {
printf("Network ESSID: %s\n", result->b.essid);
result = result->next;
}在你的密码上祝你好运!
发布于 2013-07-24 01:31:12
这是一个完全不同的问题,你认为你有。正在发生的事情是,您从未初始化过result,所以如下:
network = result->b.essid;
只会给你带来垃圾,而这个:
result = result->next;
可能会给你一个无限的循环。
您可能应该在编译器上打开警告级别,并/或查看诸如splint和Val差伦之类的工具。
https://stackoverflow.com/questions/17823672
复制相似问题