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

时间:2013-07-24 01:21:03

标签: c

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

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

感谢您的帮助!

2 个答案:

答案 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;
}

祝你的代码真好!