c - 在C中输入多行字符串

标签 c arrays string

我对编码相当陌生,目前正在学校学习 C 语言的编程类(class)。我们收到了一项作业,但我在第一部分遇到了一些困难。我们正在学习如何使用字符串处理库(stdlib.h),作业的目标是从键盘输入多行文本。老师建议我们使用二维数组来做到这一点,但我有点卡住了。这是我编写的代码:

int main(void) {
    char string[3][SIZE];
    int i, j;
    int c;

    printf("Enter three lines of text:\n");

    for (i = 0; i < 3; i++) {
        j = 0;
        while ((j < SIZE) && (c = getchar() != '\n')) {
            string[i][j] = c;
            j++;
        }
    }

    for (i = 0; i < 3; i++) {
        for (j = 0; j < SIZE; j++) {
            printf("%c", string[i][j]);
        }
        printf("\n");
    }

    return 0;
}

我想指出的一些观点是,我使用 getchar() 函数一次接收一个字符的输入,并且第二个 for 循环我打算打印存储在每一行中的每一行文本字符串数组的。

输入是任意三行文本字符串,例如:

Hi my name is John.\n
I am from the US\n
and I'm a student.

当前输出如下:

Enter three lines of text:
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr...

我期望的输出是:

Enter three lines of text:\n
Hi my name is John.\n
I'm from the US\n
and am a student.

任何提示或建议将不胜感激。谢谢!

最佳答案

首先让我赞扬一下您从 C 语言开始的事实。这是最值得学习的语言(更好的是汇编本身) - 您将充分理解事物是如何工作的,而您不会如果从某种基于 C 编写的语言(如 Java 和 Python)开始。 但这是一条艰难而漫长的路,这是值得的。

关于代码:有很多事情要做,你已经制造了很多有趣的错误,这些错误会在你运行它的每次机器上重现不同的有趣的事情。

首先:要使您的代码以某种方式工作,您需要添加括号:

    while ((j < SIZE) && ((c = getchar()) != '\n')) {

在 C 中,一切都是二进制(或整数,取决于你如何看待它),默认绑定(bind)位于右侧 a op1 b op2 c op3 d.. 首先对 op3 进行计算 c op3 d = r1,然后得到 op1 b op2 r1 等等。 因此,您将 getchar() 的值与字符 '\n' 的值进行比较 - 它们不相等,因此您得到 TRUE(值 1)并将其存储在局部变量 c 中。

接下来,由于初始化数组的方式,您仍然遇到一些问题:

     char string[3][SIZE];

它的作用只是将进程地址空间的 3*SIZE*sizeof(char) 字节“委托(delegate)”给标记为“字符串”的内容。但这并不能清除这些字节上之前(您的程序,甚至之前)的所有残留信息,因此,如果您的程序中发生 SIZE == 100 并且您曾经将信用卡存储在真实地址内存中(RAM)映射到程序内存的该区域,当您通过 printf 打印它时,您将看到您的信用卡 - 如果您没有覆盖这 300 个字节。

这可能会帮助您查看它:

#include <stdlib.h>
#include <stdio.h>

#define SIZE 10

int main(void) {
    char string[3][SIZE];
    int i, j;
    int c;

    for(i = 0; i < 3; i++)
      for(j = 0; j < SIZE; j++){
        string[i][j] = 0;
      }
    printf("Enter three lines of text:\n");

    for (i = 0; i < 3; i++) {
        j = 0;
        while ((j < SIZE) && ((c = getchar()) != '\n')) {
            string[i][j] = c;
            j++;
        }
    }

    for (i = 0; i < 3; i++) {
        for (j = 0; j < SIZE; j++) {
            printf("%c", string[i][j]);
        }
        printf("\n");
    }

    return 0;
}

还要注意 getchar() 可能在输入和换行时表现得很糟糕 - 这取决于您是否在输入(换行)时将输入发送到程序之前控制台缓冲输入。更多这里How to avoid press enter with any getchar()

关于c - 在C中输入多行字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43959963/

相关文章:

c - 基本堆栈中的内存泄漏

c - 害怕不阅读结构

c - 意外标记附近的语法错误 `('

java - 如何删除相同的单词?

php - 只打印字符串的前 5 行

java - Android 将字符串转换为 JSON

C程序: pointer and pointer of string

arrays - MongoDB:嵌套数组计数+原始文档

C 将逗号分隔的字符串转换为数组

java - 切换大小写不返回字符串