我需要一些帮助来纠正这段代码,因为它会打印出一些奇怪的东西。
我使用无线工具和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;
}
谢谢你的帮助!
这与您认为的问题完全不同。现在发生的事情是,你永远不会初始化result
,所以这个:
network = result->b.essid;
只会给你垃圾,而这个:
result = result->next;
可能会给你一个无限的循环。
您可能应该提高编译器的警告级别,和/或查看split和Valgrind等工具。
只是为了形式化。。。
您在for循环中以及在for声明中都在增加k。输出每个其他字符,并实际读取超过网络[]的界限。(你说你很累……那就行了!)
另外,您使用的是strnlen函数,但没有指定最大长度。我强烈建议始终使用-Wall-Wextra编译,并可能使用-Wunused来显示问题。要格外挑剔,也要使用-Werror,修复显示的警告和错误,你会编写更好的代码,养成更好的习惯。
另一件事是,如果可以使用strlen(或strnlen)函数来确定长度,则循环是多余的。一个简单的:(正如你最初指出的)
printf("Network ESSID: %sn", result->b.essid);
足够了。
essid可能在结构中定义为'char ESSD[xx];',或(更好)'char*essid;',这意味着已经是一个字符字符串。(C中的"char string"不是以与C++中的"string 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: %sn", result->b.essid);
result = result->next;
}
祝福你的代码!