【问题标题】:Why can't I reuse c = getchar(); on str2 after using it on str1? (C)为什么我不能重用 c = getchar();在str1上使用它之后在str2上? (C)
【发布时间】: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];

其次,我定义了变量cijlim,其中c将连接到str1str2i 将用于迭代 str1j 用于 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。这是您的代码中的错字还是仅在这里?
  • 糟糕,这是一个错字。对于那个很抱歉。我尝试了cd,但我完全忘记了改变它。现在已经解决了。
  • 你能展示一个完整的程序来演示这个问题吗?您显示的代码中存在许多潜在问题(例如,ij 未初始化)。我怀疑其中许多只是问题中的拼写错误(就像 Leiaz 发现的问题一样),但如果没有更全面地说明您的问题,就无法确定。
  • 完整代码的链接已发布,但我要求您在 5 分钟后查看它,因为有很多事情会让您感到困惑,我正在修复它们。
  • 大家可以看一下:gist.github.com/alexanderfalgui/3d74a5cf778a79c74ec4 它有两个版本:一个是错误发生的时候,另一个是我解决问题时所做的。

标签: c string char character getchar


【解决方案1】:

声明:

c = getchar();

从标准输入(即:键盘)中检索单个字符(作为 int 类型)并将该值存储在 c 中。因此,每次执行此行时,一般都会等待用户输入一个字符。

问题代码似乎正在尝试获取两个字符串。说白了,问题代码在两个循环中都可以使用c。显然还有其他问题。

注意:除了以下语句之外,cstr1str2 之间没有从属关系,该语句将单个字符从 c 复制到 str1(或 str2)数组:

str2[j] = c;  

从代码中完全删除 getchar() 调用,并简单地用测试值初始化两个字符串:

char str1[] = "Alexander B. Falgui";
char str2[] = ".B";

将这些字符串传递给您的 squeeze() 函数并验证结果是否符合预期。


见剧透代码here

【讨论】:

  • 您的答案似乎时常变化……我会在 10 分钟后再看一遍。但我似乎在你的答案中找不到我要找的答案,我想我会继续重读。
  • @AlexanderB.Falgui,也许我刚刚添加到末尾的“剧透”链接会有所帮助?
  • 不,“剧透链接”没有帮助。我从来没有问过这个练习的解决方案,我问为什么我不能像为str1 那样为str2 分配c = getchar();。我想声明尽可能少的变量。
猜你喜欢
  • 2010-09-16
  • 2013-01-19
  • 2015-05-14
  • 1970-01-01
  • 2013-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多