由于英语不是我的母语,我事先对任何拼写或语法错误表示歉意。
我对HTML很陌生,我制作了一个C程序来自动化一个重复的编码(创建按钮破坏者,询问隐藏的内容以及每次写在按钮上的内容)
问题是我不得不转换我想用十六进制写的所有文本(char数组),因为它包含了C语言的一些保留字符.
该程序运行顺利,目前符合我的需要,但我想知道是否有其他方法,而不是把一切转化为六角。
另外,gcc两次给我这个警告:
格式‘%s’期望类型为‘char’的参数,但参数2的类型为‘char()50’-Wformat
在这些行之后:
scanf("%s", &hidden_text);(hidden_text是初始化为char的数组,如:
char hidden_text[50];)我该怎么修正这个警告?将%50s传递给scanf不起作用(程序运行了,但这个警告令我困扰,如果有人告诉我出路,我会很高兴的)
如果有人看到升级该程序的方法或有任何提示,请帮助我的新程序员。(为了记录在案,我使用linux,Emacs是我的IDE,我用gcc编译)
下面是源代码(希望我不会因为发布太多的文本而被报道):
#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);
}
}提前谢谢,祝您白天(或晚上)愉快!
发布于 2014-03-06 16:35:55
如果使用scanf( "%s", ... ),则删除参数是一个char *,因为它只需要将输入复制到其中的地址。如果您声明char hidden_text[50];,那么hidden_text已经是指向该数组的(常量)指针。所以你得打电话
scanf( "%s", hidden_text );不
scanf( "%s", &hidden_text );更好的是打电话
scanf( "%49s", hidden_text );如果输入太长,则防止程序崩溃(注意,格式字符串中的长度不包括终止的'\0')。
发布于 2014-03-06 16:35:17
请尝试
scanf("%s", &hidden_text[0]);因为您必须传递字符串的第一个字符的地址。
发布于 2014-03-07 06:51:46
其他人已经指出了scanf警告的原因。你的程序还有其他的问题,大多数都是文体问题。
main是特殊的,因为它只能有特定的签名。传入文件句柄不是其中之一。(您还隐藏了全局变量FILE *f,这在您的情况下并不有害,但这可能不是您想要的。)在这种情况下,在不使用任何命令行参数的情况下,应该使用:
int main()fprintf、putc或fputs )的输出函数。函数fwrite编写一定长度的原始数据,可以使用,但您必须始终传递正确的字符串长度。说到这里:将常量字符串长度传递给十六进制编码的字符串,如下所示:
fwrite(part2,sizeof(char),23,f);
导致灾难的原因是:如果您的字符串发生了更改,怎么办?你也得更新电话。您至少应该使用strlen(part2)而不是常量23。scanf读取您的输入。这是可以的,但可能不是最好的方法:使用scanf扫描的字符串不能包含空格,实际上它们是单个单词。您可以使用%[...]语法来指定要读取的字符,但在我看来,这很复杂。我建议使用fgets,它读取整行。(产生的字符串确实有一个尾随换行符,在处理之前应该删除它。)scanf返回EOF,fgets返回NULL。<copy & paste>在输出文件中读取<copy & paste>。将所有这些放在一起,您的程序现在可能如下所示:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void print_html(FILE *f, const char *str)
{
while (*str) {
switch (*str) {
case '<': fprintf(f, "<"); break;
case '>': fprintf(f, ">"); break;
case '&': fprintf(f, "&"); 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;
}https://stackoverflow.com/questions/22229895
复制相似问题