0

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

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

谢谢您的帮助!

4

2 回答 2

4

这是一个完全不同的问题,你认为你有。发生的事情是你从来没有初始化result,所以这个:

network = result->b.essid;

只会给你垃圾,这是:

result = result->next;

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

您可能应该在编译器上调高警告级别,和/或查看诸如夹板和 Valgrind 之类的工具。

于 2013-07-24T01:31:12.440 回答
3

只是为了把事情正式化...

您在 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;' ,这意味着它已经是一个 char 字符串。(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;
}

祝你的代码好运!

于 2013-07-24T20:35:08.320 回答