- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在解决 USACO 上的问题。在这个问题中,我必须以两个字符串作为输入并计算以 47 为模的数值。如果值相同,则要打印 GO,否则必须打印 STAY。初始数值将通过字母数值的乘积计算(A 为 1,Z 为 26),然后通过取模计算最终数字。
我的程序正在编译,没有任何错误,第一个案例也成功了。但问题出在第二种情况以及我的文件的附加方式。程序如下:-
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAX 6
main()
{
int cal(char *ptr);
int a,b;
char *comet,*group;
FILE *fptr;
comet=malloc(6*sizeof(char));
group=malloc(6*sizeof(char));
scanf("%s",comet);
a=cal(comet);
scanf("%s",group);
b=cal(group);
fptr=fopen("ride.out","a+"); (1)
//fptr=fopen("ride.txt","a+"); (2)
if(a==b)
fprintf(fptr,"GO\n"); (3)
//printf("GO\n"); (4)
else
fprintf(fptr,"STAY\n"); (5)
//printf("STAY\n"); (6)
fclose(fptr);
return 0;
}
int cal(char *ptr)
{
int c,prod=1,mod;
while(*ptr)
{
c=(*ptr++)-'A'+1;
prod=prod*c;
}
mod=prod%47;
return mod;
}
输出:-
第一种情况是设置两个字符串:-
第二种情况在错误通知本身中给出。
如果我从 (2) 中删除注释符号并将其放在 (1) 上,那么程序就可以正常工作,因为我可以看到文件的内容,并且它们的显示方式正如评分系统想要的那样。 (1) 的实际陈述并没有发生这种情况。第(4)行和(6)行的注释也很好,但第(1)行不行。我无法弄清楚这一点。有什么帮助吗?
最佳答案
首先一些注意事项:
main()
:体面的主要是:
int main(void)
or
int main(int argc, char *argv[])
使用 malloc()
您应该始终检查它是否返回 NULL
,又名失败或失败。
free()
malloc 的对象。有关代码的更多详细信息:
main
中的第一行您声明 cal()
的签名。尽管这有效,您可能会将其放在 main
之上,或输入 cal()
以上功能完整main
.
您有一个定义 #define MAX 6
你从不使用的。如果最多有六个字符并且您读取了一个字符串,则还必须考虑尾随零。
例如来自cplusplus.com scanf :
specifier 's': Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence.
因此:
#define MAX_LEN_NAME 7
...
comet = malloc(sizeof(char) * MAX_LEN_NAME);学习使用
malloc()
很好。在这里这样做并没有什么错误。 但是因为它很简单,您可能会想使用:char comet[MAX_LEN_NAME] = {0};
char group[MAX_LEN_NAME] = {0};相反。至少:如果使用
malloc
然后检查是否成功并在完成后释放,否则使用静态数组。更安全的 scanf()
scanf()
给定"%s"
不会停止读取目标缓冲区的大小 - 它继续读取数据并将其写入内存中的连续地址,直到读取到空白。例如:/* data stream = "USACOeRRORbLAHbLAH NOP" */
comet = malloc(szieof(char) * 7);
scanf("%s", buf);在内存中我们会:
Address (example)
0x00000f comet[0]
0x000010 comet[1]
0x000011 comet[2]
0x000012 comet[3]
0x000013 comet[4]
0x000014 comet[5]
0x000015 comet[6]
0x000016 comet[7]
0x000017 /* Anything; Here e.g. group starts, or perhaps fptr */
0x000018 /* Anything; */
0x000019 /* Anything; */
...当阅读上面建议的流/字符串时,我们不会读
USACOe
进入comet
但我们会继续阅读超出comet
的范围。换句话说(可能)覆盖其他变量等。这可能听起来很愚蠢,但由于 C 是一种低级语言,这是您必须了解的事情之一。随着您了解更多,您很可能也会爱上它的力量:)为了防止这种情况,您可以通过例如限制读取使用
maximum length
+[what to read]
。例如:scanf("%6[A-Z]", comet);
| | |
| | +------- Write to `comet`
| +-------------- Read only A to Z
+---------------- Read maximum 6 entities输入数据
阅读您的预期结果、您的错误、您的
(N)
评论等。听起来您应该有一个输入文件和一个输出文件。正如您的代码现在一样,它依赖于从标准输入读取数据,又名
stdin
。因此您还可以使用scanf()
。我怀疑你应该read from file withfscanf()
相反。所以:类似:
FILE *fptr_in;
char *file_data = "ride.in";
int res;
...
if ((fptr_in = fopen(file_data, "r")) == NULL) {
fprintf(stderr, "Unable to open %s for reading.\n", file_data);
return 1; /* error code returned by program */
}
if ((res = fscanf(fptr_in, "%6[A-Z]%*[ \n]", comet)) != 1) {
fprintf(stderr, "Read comet failed. Got %d.\n", res);
return 2;
}
b = cal(comet);
if ((res = fscanf(fptr_in, "%6[A-Z]%*[ \n]", group)) != 1) {
fprintf(stderr, "Read group failed. Got %d.\n", res);
return 2;
}
...cal() 函数
首先,命名。假设这是一个项目的开始,最终会产生多个文件和数千行代码。您可能没有名为
cal()
的函数。学会给函数起个好听的名字。上面关于编码风格的链接给出了一些要点。恕我直言,在小型项目中也这样做。这是一个很好的练习,可以让你在写大字的时候变得更容易。命名它例如cprod_mod_47()
.然后是
mod
变量(可能还有 c)是多余的。另一种选择可能是:<小时/>int cprod_mod_47(char *str)
{
int prod = 1;
while (*str)
prod *= *(str++) - 'A' + 1;
return prod % 47;
}一些更一般的建议
编译时使用许多警告和错误选项。例如。如果使用 gcc 说:
$ gcc -Wall -Wextra -pedantic -std=c89 -o my_prog my_prog.c
这是巨大的帮助。进一步是使用像
valgrind
这样的工具和gdb
无价之宝。
关于c - 在 C 中附加输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14661859/
我关注了 tutorial on creating a popup for an add-on在 Firefox 中,效果很好。 我现在遇到的问题是它创建的弹出窗口不会更改大小以适应我添加到其中的内容
我有一些视频,我需要连接一个标题并添加一些覆盖,问题是我需要先做覆盖,否则时间不正确,然后才将标题连接到视频的开头 ffmpeg -i talk.mp4 -i start_pancarte.png
我正在尝试附加一个 CSV 文件。这是我正在使用的线路。不幸的是,我找不到 export-csv 的附加选项。任何想法都有助于使其发挥作用。 Get-ADGroupMember "Domain Adm
我正在努力理解 Attach API (com.sun.tools.attach.*) 的用途。它的典型用途是什么?它是为了“模拟”JVM,以便您可以在不部署/启动代码的情况下测试您的代码吗?它是一个
我不明白为什么这不起作用。 soup_main = BeautifulSoup('FooBar') soup_append = BeautifulSoup('Meh') soup_main.body.
我有以下代码来返回我想要的字符串 $sql = " SELECT `description` FROM `auctions` WHERE `description` REGEX
我正在尝试从数组中附加具有多个值的元素,但我做错了。这是我的代码: for(var i=0; i ` + pricesArray[i].start_date ` ` + pricesArray[i
我正在尝试将图像链接添加到此 javascript 附加表中。使图像位于按钮上方 这是代码 $("#1").append(""+section+""+no+""+price+""+button+""
我有一个问题,我已经解决了,但它太烦人了。 我有一个 js 代码,当使用“追加”按下按钮时,它会放下一些 html 代码,并且通过该代码,我为 x 按钮提供了一个 id,并为容器元素提供了一个 id。
我想逐行读取文件,并且每一行可能都有很多字符。 这个版本的readline效果很好 func readLine(r *bufio.Reader) ([]byte, error) { var (
我有一个网站,每次用户登录或注销时,我都会将其保存到文本文件中。 如果不存在,我的代码在附加数据或创建文本文件时不起作用。这是示例代码 $myfile = fopen("logs.txt", "wr"
我正在尝试使用 typescript 和 Formik 创建一个自定义输入字段。我可以就完成以下代码的最佳方式获得一些帮助吗?我需要添加额外的 Prop 标签和名称......我已经坚持了一段时间,希
我有一个字符串 big_html,我想将它添加到某个 div 中。我观察到以下方面的性能差异: $('#some-div').append( big_html ); // takes about 10
如何使用 FormData 创建以下结果 ------WebKitFormBoundaryOmz20xyMCkE27rN7 Content-Disposition: form-data; name="
有没有办法附加 jQuery 事件处理程序,以便在任何先前附加的事件处理程序之前触发该处理程序?我遇到了this article ,但代码不起作用,因为事件处理程序不再存储在数组中,而这正是他的代码所
我正在开发一个需要网络登录的 iPhone 应用程序。像往常一样我打电话 [[UIApplication sharedApplication] openURL:loginURL]; 这将关闭应用程序并
我想开发一个仅针对特定域激活的扩展。 我不希望它在不浏览此特定域时出现在浏览器菜单中。 有可能这样做吗? 最佳答案 可能:对于菜单,您可以添加一个弹出窗口侦听器,用于检查当前加载的URL(docs f
这段 JavaScript 代码 function writeCookie(CookieName, CookieValue, CookieDuration) { var expiration
我正在使用 Handlebars 来渲染使用ajax从本地服务器获得的信息。我的 HTML 看起来像: {{#each Tabs}}
我尝试了以下代码,但当输入框中没有数据时它不会通知。当我直接添加此内容(不附加)时,它会起作用。我在这里做错了什么 var output = "\n"+ "\n"+
我是一名优秀的程序员,十分优秀!