我正在 K&R C 中做练习 2-4,其中我要选择 squeeze(s1,s2)
的替代方案,删除 s2
中出现的每个字符s1
。
我将向您展示我如何从顶部制作这部分以及为什么,所以我请您耐心等待......(这是发生错误时的版本)
首先,我声明了 2 个变量 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...
首先,程序读取输入创建字符串...
和删除字符串...
,然后打印它们。
但是为什么我不能像在 str1
上那样在 str2
上重复使用 c = getchar();
呢?这样做不是会重新分配 str2
的字符吗?
Here是完整的代码。
最佳答案
声明:
c = getchar();
从标准输入(即键盘)检索单个字符(作为 int 类型)并将该值存储在 c
中。因此,每次执行该行时,通常都会等待用户输入一个字符。
问题代码似乎正在尝试获取两个字符串。说白了,问题代码在两个循环中都可以使用c
。显然还有其他问题。
注意:除了以下语句之外,c
与 str1
或 str2
之间没有从属关系,该语句从以下语句复制单个字符c
到 str1(或 str2)数组:
str2[j] = c;
从代码中完全删除 getchar() 调用,只需使用测试值初始化两个 strng:
char str1[] = "Alexander B. Falgui";
char str2[] = ".B";
将这些字符串传递到您的 squeeze()
函数中并验证结果是否符合预期。
查看剧透代码 here .
关于c - 为什么我不能重用 c = getchar();在 str1 上使用后在 str2 上? (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23878448/