我对编码相当陌生,目前正在学校学习 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/