无线工具:将网络essid转换为char



我需要一些帮助来纠正这段代码,因为它会打印出一些奇怪的东西。

我使用无线工具和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;
}

祝福你的代码!

最新更新