首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无线工具:将网络essid转换为char

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

Stack Overflow用户
提问于 2013-07-24 01:21:03
回答 2查看 164关注 0票数 0

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

我使用无线工具和iwlib.h扫描无线网络并获取他们的ESSID。当我使用:

代码语言:javascript
复制
printf("Network name %s:", result->b.essid);

然后,它就像一个魅力,并打印出我的名字。但是,我希望将其转换为char,以便以后可以通过网络通过缓冲区发送它。

(除非我可以发送结果,并且“名称提取”可以发生在另一边?那不可能吗?)

请参阅下面的示例代码(不是完整的代码),说明我是如何尝试这样做的,但结果是我得到了真正随机的字符。

代码语言:javascript
复制
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;
}

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-24 20:35:08

只是为了正规化..。

您将在for循环中以及for声明中递增。输出所有其他字符,并实际阅读超出了network[]的界限。(你说你很累.这样就行了!)

另外,您使用的是strnlen函数,但没有指定最大长度。I建议始终使用-Wall -Wextra进行编译,并可能使用-Wunused来显示问题。要特别挑剔,也要使用-Werror,修复所显示的警告和错误,您将编写更好的代码并养成更好的习惯。

另外,如果可以使用strlen (或strnlen)函数来确定长度,则循环是多余的。一个简单的:(正如你最初指出的)

代码语言:javascript
复制
printf("Network ESSID: %s\n", result->b.essid);

就够了。

essid可能在结构中被定义为'char essidxx;‘或(更好的) ' char * essid;',这意味着它已经是char字符串了。(C中的“char”是而不是,其存储方式与C++中的“string”相同)

{Grin}如果您真的想这样写它:

代码语言:javascript
复制
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;
}

简短的版本:

代码语言:javascript
复制
while (result != NULL) {
    printf("Network ESSID: %s\n", result->b.essid);
    result = result->next;
}

在你的密码上祝你好运!

票数 3
EN

Stack Overflow用户

发布于 2013-07-24 01:31:12

这是一个完全不同的问题,你认为你有。正在发生的事情是,您从未初始化过result,所以如下:

network = result->b.essid;

只会给你带来垃圾,而这个:

result = result->next;

可能会给你一个无限的循环。

您可能应该在编译器上打开警告级别,并/或查看诸如splint和Val差伦之类的工具。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17823672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档