【问题标题】:Wireless tools: Converting network essid to char无线工具:将网络 essid 转换为 char
【发布时间】:2013-07-25 04:35:08
【问题描述】:

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

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

感谢您的帮助!

【问题讨论】:

  • 您还将 k 增加两次。要么在 for 语句中执行,要么在循环中执行,但不能同时执行。 (唠叨点......预增量(++k))
  • 这就是问题所在,这是我的愚蠢错误。长时间工作让我的大脑停了下来:)非常感谢。
  • SSID 可以是 unicode,不是吗?

标签: c


【解决方案1】:

这与您认为的问题完全不同。发生的事情是您从未初始化 result,所以:

network = result-&gt;b.essid;

只会给你垃圾,而这个:

result = result-&gt;next;

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

您可能应该调高编译器的警告级别,和/或查看 splint 和 Valgrind 等工具。

【讨论】:

  • 我上面显示的代码不是完整的代码。 result 有一个值,它是 result = head.result;我已经说过,当我直接打印 result->b.essid 时,我会得到正确的输出
  • 啊,当然,我早该知道你需要的是你没有发布的代码的帮助,而不是你发布的代码。
  • 我没有批评你的帮助。我刚刚澄清了。我现在只是告诉你,我遇到的问题与代码的任何其他部分无关。
  • 我很感激,但无论如何,如果你知道你的问题是什么,你就不会在这里问这个问题。很多时候,问题绝对是询问者没有预料到的,所以如果你不发布工作代码,那么任何人都很难帮助你,而且任何尝试的人都会感到烦恼如果您没有发布代码的重要部分。例如,您可以手动创建一个 wireless_scan 结构并发布一个简短、完整的工作程序来演示您的错误吗?
  • 当我在我的问题中进一步评论时,这个问题是一个愚蠢的增量。不过,感谢您的宝贵时间,非常感谢。
【解决方案2】:

只是为了形式化……

您在 for 循环和 for 声明中都增加了 k。输出所有其他字符并实际读取超出 network[] 的范围。 (你说你很累……行了!)

另一件事,您正在使用 strnlen 函数,但没有指定最大长度。我强烈建议始终使用 -Wall -Wextra 和可能的 -Wunused 进行编译以显示问题。更加挑剔并使用 -Werror,修复显示的警告和错误,您将编写更好的代码并养成更好的习惯。

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

printf("Network ESSID: %s\n", result->b.essid);

足够了。

essid 可能在结构中定义为 'char essid[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: %s\n", result->b.essid);
    result = result->next;
}

祝您代码顺利!

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多