我需要一些帮助来纠正这段代码,因为它打印出一些奇怪的东西。
我使用无线工具和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;
}
感谢您的帮助!
答案 0 :(得分:4)
这与你认为的那个问题完全不同。发生的事情是你永远不会初始化result
,所以这个:
network = result->b.essid;
只会给你垃圾,这个:
result = result->next;
可能会给你一个无限循环。
您可能应该在编译器上调高警告级别,和/或查看splint和Valgrind等工具。
答案 1 :(得分:3)
只是为了正式化......
你在for循环和for声明中增加k。输出所有其他字符并实际读取超过网络[]的范围。 (你说你很累......那就行了!)
另一件事,你正在使用strnlen函数,但没有指定最大长度。我强烈建议始终使用-Wall -Wextra进行编译,并且可能使用-Wunused来显示问题。要特别挑剔和使用-Werror,修复显示的警告和错误,你会编写更好的代码并建立更好的习惯。
另外一件事,如果你可以使用strlen(或strnlen)函数来确定长度,那么你的循环是多余的。一个简单的:(正如你最初指出的那样)
printf("Network ESSID: %s\n", result->b.essid);
就够了。
essid可能在结构中被定义为'char essid [xx];',或者(更好)'char * essid;',这暗示它是< em>已经一个字符串。 (C中的'char string' NOT 以与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: %s\n", result->b.essid);
result = result->next;
}
祝你的代码真好!