首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动交互编程

自动交互编程
EN

Stack Overflow用户
提问于 2014-03-06 16:12:19
回答 3查看 118关注 0票数 1

由于英语不是我的母语,我事先对任何拼写或语法错误表示歉意。

我对HTML很陌生,我制作了一个C程序来自动化一个重复的编码(创建按钮破坏者,询问隐藏的内容以及每次写在按钮上的内容)

问题是我不得不转换我想用十六进制写的所有文本(char数组),因为它包含了C语言的一些保留字符.

该程序运行顺利,目前符合我的需要,但我想知道是否有其他方法,而不是把一切转化为六角。

另外,gcc两次给我这个警告:

格式‘%s’期望类型为‘char’的参数,但参数2的类型为‘char()50’-Wformat

在这些行之后:

代码语言:javascript
复制
scanf("%s", &hidden_text);

(hidden_text是初始化为char的数组,如:

代码语言:javascript
复制
char hidden_text[50];)

我该怎么修正这个警告?将%50s传递给scanf不起作用(程序运行了,但这个警告令我困扰,如果有人告诉我出路,我会很高兴的)

如果有人看到升级该程序的方法或有任何提示,请帮助我的新程序员。(为了记录在案,我使用linux,Emacs是我的IDE,我用gcc编译)

下面是源代码(希望我不会因为发布太多的文本而被报道):

代码语言:javascript
复制
#include<stdlib.h>
#include<stdio.h>
#include<string.h> /*strlen use this*/
int number_of_spoilers=10; /* the number of spoiler buttons you want to create (changed that value so you can test fast)*/
int a=0;
int spoiler=0; /*the spoiler Id I need to pass between each part*/
char part0[14]="\x3c\x68\x74\x6d\x6c\x3e\x0d\x0a\x3c\x62\x6f\x64\x79\x3e";
char part1[9]="\x3c\x64\x69\x76\x20\x69\x64\x3d\x22"; 
char part2[23]="\x22\x20\x73\x74\x79\x6c\x65\x3d\x22\x64\x69\x73\x70\x6c\x61\x79\x3a\x6e\x6f\x6e\x65\x22\x3e"; 
char hidden_text[50];
char part3[100]="\x3c\x2f\x64\x69\x76\x3e\x3c\x62\x75\x74\x74\x6f\x6e\x20\x74\x69\x74\x6c\x65\x3d\x22\x43\x6c\x69\x63\x6b\x20\x74\x6f\x20\x73\x68\x6f\x77\x2f\x68\x69\x64\x65\x20\x63\x6f\x6e\x74\x65\x6e\x74\x22\x20\x74\x79\x70\x65\x3d\x22\x62\x75\x74\x74\x6f\x6e\x22\x20\x6f\x6e\x63\x6c\x69\x63\x6b\x3d\x22\x69\x66\x28\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x67\x65\x74\x45\x6c\x65\x6d\x65\x6e\x74\x42\x79\x49\x64\x28\x27";
char part4[53]="\x27\x29\x20\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x3d\x27\x6e\x6f\x6e\x65\x27\x29\x20\x7b\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x67\x65\x74\x45\x6c\x65\x6d\x65\x6e\x74\x42\x79\x49\x64\x28\x27";
char part5[51]="\x27\x29\x20\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x27\x27\x7d\x65\x6c\x73\x65\x7b\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x67\x65\x74\x45\x6c\x65\x6d\x65\x6e\x74\x42\x79\x49\x64\x28\x27";
char part6[27]="\x27\x29\x20\x2e\x73\x74\x79\x6c\x65\x2e\x64\x69\x73\x70\x6c\x61\x79\x3d\x27\x6e\x6f\x6e\x65\x27\x7d\x22\x3e";
char button_text[50];
char part7[9]="\x3c\x2f\x62\x75\x74\x74\x6f\x6e\x3e";
char part_end[16]="\x3c\x2f\x68\x74\x6d\x6c\x3e\x0d\x0a\x3c\x2f\x62\x6f\x64\x79\x3e";
FILE *f=NULL;
main(FILE *f)
{
    f=fopen("/home/Spoilers.html","a");
    if(f==NULL)
        printf("Can't open file");
    else{
        fwrite(part0, sizeof(char), 14,f);
        while(a!=number_of_spoilers){
            printf("%s","button text ? :");
            scanf("%s", &button_text);

            printf("%s", "hidden text ? :");
            scanf("%s", &hidden_text);

            fwrite(part1, sizeof(char), 9,f); 
            char hex[5];
            sprintf(hex, "%x", spoiler); /*change the spoilerId value to hexa*/
            fwrite(&hex, sizeof(char), strlen(hex),f);

            fwrite(part2, sizeof(char), 23,f);
            fwrite(hidden_text, sizeof(char), strlen(hidden_text),f);

            fwrite(part3, sizeof(char), 100,f);
            fwrite(&hex, sizeof(char), strlen(hex),f);

            fwrite(part4, sizeof(char), 53,f);
            fwrite(&hex, sizeof(char), strlen(hex),f);

            fwrite(part5, sizeof(char), 51,f);
            fwrite(&hex, sizeof(char), strlen(hex),f);

            fwrite(part6, sizeof(char), 27,f);
            fwrite(button_text, sizeof(char), strlen(button_text),f);

            fwrite(part7, sizeof(char), 9, f);

            a=a+1; spoiler=spoiler+1;
        }
        fwrite(part_end, sizeof(char), 16,f); /*contain "</body></html>"*/
        fclose(f);
    }
}

提前谢谢,祝您白天(或晚上)愉快!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-06 16:35:55

如果使用scanf( "%s", ... ),则删除参数是一个char *,因为它只需要将输入复制到其中的地址。如果您声明char hidden_text[50];,那么hidden_text已经是指向该数组的(常量)指针。所以你得打电话

代码语言:javascript
复制
scanf( "%s", hidden_text );

代码语言:javascript
复制
scanf( "%s", &hidden_text );

更好的是打电话

代码语言:javascript
复制
scanf( "%49s", hidden_text );

如果输入太长,则防止程序崩溃(注意,格式字符串中的长度不包括终止的'\0')。

票数 1
EN

Stack Overflow用户

发布于 2014-03-06 16:35:17

请尝试

代码语言:javascript
复制
scanf("%s", &hidden_text[0]);

因为您必须传递字符串的第一个字符的地址。

票数 0
EN

Stack Overflow用户

发布于 2014-03-07 06:51:46

其他人已经指出了scanf警告的原因。你的程序还有其他的问题,大多数都是文体问题。

  • 你没有使用法律形式的“main”-这也应该给gcc一个警告: 主(文件*f) ..。 函数main是特殊的,因为它只能有特定的签名。传入文件句柄不是其中之一。(您还隐藏了全局变量FILE *f,这在您的情况下并不有害,但这可能不是您想要的。)在这种情况下,在不使用任何命令行参数的情况下,应该使用: int main()
  • 您的输出是文本,因此应该使用适合于以空结尾的字符串( fprintfputcfputs )的输出函数。函数fwrite编写一定长度的原始数据,可以使用,但您必须始终传递正确的字符串长度。说到这里:将常量字符串长度传递给十六进制编码的字符串,如下所示: fwrite(part2,sizeof(char),23,f); 导致灾难的原因是:如果您的字符串发生了更改,怎么办?你也得更新电话。您至少应该使用strlen(part2)而不是常量23
  • 您使用scanf读取您的输入。这是可以的,但可能不是最好的方法:使用scanf扫描的字符串不能包含空格,实际上它们是单个单词。您可以使用%[...]语法来指定要读取的字符,但在我看来,这很复杂。我建议使用fgets,它读取整行。(产生的字符串确实有一个尾随换行符,在处理之前应该删除它。)
  • 程序中的按钮数是固定的。对于一个简单的程序来说,这是可以的,但最终您希望按钮的数量是灵活的。因此,最好读到输入结束( Unix上的Ctrl,Windows上的Ctrl)。输入函数返回特殊值,以指示已经到达输入结束:在这种情况下,scanf返回EOFfgets返回NULL
  • 您以扰流板和按钮文本的形式写出的字符串应该是“净化”的,即对HTML特殊的字符应该被屏蔽,以便输入<copy & paste>在输出文件中读取&lt;copy &amp; paste&gt;
  • 最后一个注意事项:你写出(长)代码来显示和隐藏每个按钮的按钮。您可以通过为该函数编写一次函数,然后调用该函数来缩短时间。

将所有这些放在一起,您的程序现在可能如下所示:

代码语言:javascript
复制
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

void print_html(FILE *f, const char *str)
{
    while (*str) {
        switch (*str) {
        case '<':   fprintf(f, "&lt;"); break;
        case '>':   fprintf(f, "&gt;"); break;
        case '&':   fprintf(f, "&amp;"); break;
        default:    putc(*str, f);
        }
        str++;
    }
}

int main()
{
    FILE *f = fopen("Spoilers.html", "w");
    int elid = 0;

    if (f == NULL) {
        fprintf(stderr, "Can't open file\n");
        exit(0);
    }

    fprintf(f, "<html>\n<head>\n");
    fprintf(f, "<script type=\"text/javascript\">\n");
    fprintf(f, "    function show_hide(elid) {\n");
    fprintf(f, "        var el = document.getElementById(elid);\n");
    fprintf(f, "        if (el) {\n");
    fprintf(f, "            if (el.style.display == 'none') {\n");
    fprintf(f, "                el.style.display = '';\n");
    fprintf(f, "            } else {\n");
    fprintf(f, "                el.style.display = 'none';\n");
    fprintf(f, "            }\n");
    fprintf(f, "        }\n");
    fprintf(f, "    }\n");
    fprintf(f, "</script>\n");
    fprintf(f, "</head>\n<body>\n");

    for (;;) {
        char button[50];
        char hidden[50];

        if (fgets(button, 50, stdin) == NULL) break;
        button[strlen(button) - 1] = '\0';

        if (fgets(hidden, 50, stdin) == NULL) break;
        hidden[strlen(hidden) - 1] = '\0';

        fprintf(f, "<div id=\"%04x\" style=\"display:none\">", elid);
        print_html(f, hidden);
        fprintf(f, "</div><button title=\"Click to show/hide content\" "
            "type=\"button\" onclick=\"show_hide('%04x')\">", elid);
        print_html(f, button);
        fprintf(f, "</button>\n");
        elid++;        
    }
    fprintf(f, "</body>\n</html>\n");
    fclose(f);

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

https://stackoverflow.com/questions/22229895

复制
相关文章

相似问题

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