c - 为什么我不能重用 c = getchar();在 str1 上使用后在 str2 上? (C)

标签 c string char character getchar

我正在 K&R C 中做练习 2-4,其中我要选择 squeeze(s1,s2) 的替代方案,删除 s2 中出现的每个字符s1

我将向您展示我如何从顶部制作这部分以及为什么,所以我请您耐心等待......(这是发生错误时的版本)

首先,我声明了 2 个变量 str1[LIMIT]str2[LIMIT],其中 LIMIT 的值为保存 1024 字符如下:

char str1[LIMIT], str2[LIMIT];

其次,我定义了变量 cijlim,其中 c 将连接到 str1str2i 将用于 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。显然还有其他问题。

注意:除了以下语句之外,cstr1str2 之间没有从属关系,该语句从以下语句复制单个字符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/

相关文章:

java - 使用 JNI 从单独的线程调用静态 Java 方法

c - 测量任何编程语言的程序的时间复杂度

c - 我制作的这个函数是否正确地将一个字符串附加到另一个字符串?

java - 'INTEGER'和 'CHAR (UCS_BASIC)' java数据库比较

c++ - dylib如何卸载自身?

c - 获取 GCC 链接器错误 : Linker input file unused because linking is not done

python - 两个字符串匹配的百分比是多少?

c - 我不知道我的角色需要什么条件

java - 在Java中将long值转换为char序列

jsp - <c :if> not working for comparing characters