【发布时间】:2014-05-26 22:25:06
【问题描述】:
我正在 K&R C 中进行练习 2-4,其中我将替换 squeeze(s1,s2),删除 s2 中出现在 s1 中的每个字符。
我将向您展示我是如何从顶部制作这部分的以及为什么所以请您耐心等待...(这是发生错误时的版本)
首先,我声明了两个变量str1[LIMIT] 和str2[LIMIT],其中LIMIT 具有保存1024 字符的值,如下所示:
char str1[LIMIT], str2[LIMIT];
其次,我定义了变量c、i、j和lim,其中c将连接到str1和str2; i 将用于迭代 str1 和 j 用于 str2。
int c, i, j, lim;
第三,我继续将c 中的每个字符连接到str1。
/* concatenate each character in c to str1 */
lim = LIMIT;
while (lim > 0) {
c = getchar();
if (c == EOF || c == '\n') {
lim = 0;
}
else {
str1[i] = c;
++i;
}
}
str1[i] = '\0';
这行得通,我可以通过打印str1 的值来证明:
Create string...
Create string...
它读取了我的输入并按预期打印,但是当我像这样在str2 上重复使用c = getchar() 时:
/* concatenate each character in c to str2 */
lim = LIMIT;
while (lim > 0) {
c = getchar();
if (c == EOF || c == '\n') {
lim = 0;
}
else {
str2[j] = c;
++j;
}
}
str2[j] = '\0';
我重用了c = getchar();,因为我想既然c = getchar();中的所有字符都已经在str1中,为什么不重新分配c = getchar();并将所有字符放入str2中?
我这样做了,但我一直被要求提供比我应该被问的更多的输入...
Create string...
Delete string...
...
... 表示它一直在询问我的意见。
我声明了一个名为d 的变量,它将是d = getchar();,并将用于连接的代码更改为str2,如下所示:
/* concatenate each character in d to str2 */
lim = LIMIT;
while (lim > 0) {
d = getchar();
if (d == EOF || d == '\n') {
lim = 0;
}
else {
str2[j] = d;
++j;
}
}
str2[j] = '\0';
然后我像这样成功运行程序:
Create string...
Delete string...
Create string...
Delete string...
程序首先读取输入Create string... 和Delete string...,然后将它们打印出来。
但是为什么我不能像在str1 上那样在str2 上重复使用c = getchar();?这样做不是为str2 重新分配字符吗?
Here是完整代码。
【问题讨论】:
-
在你的“str2 with c”
if (c == EOF || d == '\n')我看到了一个d。这是您的代码中的错字还是仅在这里? -
糟糕,这是一个错字。对于那个很抱歉。我尝试了
c和d,但我完全忘记了改变它。现在已经解决了。 -
你能展示一个完整的程序来演示这个问题吗?您显示的代码中存在许多潜在问题(例如,
i、j未初始化)。我怀疑其中许多只是问题中的拼写错误(就像 Leiaz 发现的问题一样),但如果没有更全面地说明您的问题,就无法确定。 -
完整代码的链接已发布,但我要求您在 5 分钟后查看它,因为有很多事情会让您感到困惑,我正在修复它们。
-
大家可以看一下:gist.github.com/alexanderfalgui/3d74a5cf778a79c74ec4 它有两个版本:一个是错误发生的时候,另一个是我解决问题时所做的。
标签: c string char character getchar