使用 scanf 进行字符输入,但 do-while 循环不会在空字符处停止
Using scanf for character input, but the do-while loop wont stop at the null character
我对编程完全陌生(大学第一学期),跟不上我的讲师。目前我坚持这个练习(比我愿意承认的时间要长得多)。我试图在 Internet 上(在本网站和其他网站上)寻求帮助,但我不能,因为我们的讲师让我们使用一种非常简单的 c 形式。我不一定要完整的答案。我真的很感激一些关于我在哪里出错的提示。我知道这对某些人来说可能真的很简单,这个问题可能看起来很无知或愚蠢,我为没有弄清楚问题而感到难过,但我需要尝试理解。
所以,我想做的是使用 scanf 和一个 do while 循环,这样用户就可以在数组中输入字符。但我不明白为什么当用户按下 ENTER 时循环不会停止。代码还有更多内容,但我正在尝试一步一步慢慢来。 (我不允许使用指针和 getchar 等)。
#include <stdio.h>
main()
{
char a[50];
int i;
printf("Give max 50 characters\n");
i=0;
do
{
scanf("%c", &a[i]);
i=i+1;
}
while((i<=50) && (a[i-1]!='[=10=]'));
for(i=0; i<50; i++)
printf("%c", a[i]);
}
这里没有任何以 nul 结尾的字符串,只有字符串数组。
因此,当按 enter 键时,a[i-1]
是 \n
而不是 [=13=]
(scanf
以 %c
作为参数不会以 nul 终止字符串,并且 ENTER 只是一个非空字符,代码为 10 AKA \n
)
然后不要打印字符串的其余部分,因为你会得到垃圾,只需在打印回字符串时重复使用 i
:
#include <stdio.h>
main()
{
char a[50];
int i;
printf("Give max 50 characters\n");
i=0;
do
{
scanf("%c", &a[i]);
i=i+1;
}
while((i<sizeof(a)) && (a[i-1]!='\n')); // \n not [=10=]
int j;
for(j=0; j<i; j++) // stop at i
printf("%c", a[j]); // output is flushed when \n is printed
}
同时使用 i<50
而不是 i<=50
进行测试,因为 a[50]
在数组边界之外(我已经概括为 sizeof(a)
)
您可以尝试使用此代码:
#include <stdio.h>
main()
{
char a[50];
int i;
printf("Give max 50 characters\n");
i=0;
do {
scanf("%c", &a[i]);
i=i+1;
} while(i<50 && a[i-1] != '\n');
a[i] = 0;
for(i=0; a[i] != 0; i++)
printf("%c", a[i]);
}
函数scanf("%c", pointer)
将一次读取一个字符并将其放置在pointer
位置。您正在寻找 '[=13=]'
,这是一个有效的字符串终止符,但是当您按 ENTER 时得到的换行符是 '\n'
.
此外,通过在末尾添加 '[=13=]'
(实际上是零)来终止您阅读的字符串是个好主意。然后用它来停止打印或者你可以打印一个未初始化的字符数组内容的"rest"。
这是您可以执行此操作的另一种方法。
#include <stdio.h>
// define Start
#define ARRAY_SIZE 50
// define End
// Function Prototypes Start
void array_reader(char array[]);
void array_printer(char array[]);
// Function Prototypes End
int main(void) {
char user_input[ARRAY_SIZE];
printf("Please enter some characters (50 max)!\n");
array_reader(user_input);
printf("Here is what you said:\n");
array_printer(user_input);
return 0;
}
// Scans in characters into an array. Stops scanning if
// 50 characters have been scanned in or if it reads a
// new line.
void array_reader(char array[]) {
scanf("%c", &array[0]);
int i = 0;
while (
(array[i] != '\n') &&
(i < ARRAY_SIZE)
) {
i++;
scanf("%c", &array[i]);
}
array[i + 1] = '[=10=]';
}
// Prints out an array of characters until it reaches
// the null terminator
void array_printer(char array[]) {
int i = 0;
while (array[i] != '[=10=]') {
printf("%c", array[i]);
i++;
}
}
我对编程完全陌生(大学第一学期),跟不上我的讲师。目前我坚持这个练习(比我愿意承认的时间要长得多)。我试图在 Internet 上(在本网站和其他网站上)寻求帮助,但我不能,因为我们的讲师让我们使用一种非常简单的 c 形式。我不一定要完整的答案。我真的很感激一些关于我在哪里出错的提示。我知道这对某些人来说可能真的很简单,这个问题可能看起来很无知或愚蠢,我为没有弄清楚问题而感到难过,但我需要尝试理解。
所以,我想做的是使用 scanf 和一个 do while 循环,这样用户就可以在数组中输入字符。但我不明白为什么当用户按下 ENTER 时循环不会停止。代码还有更多内容,但我正在尝试一步一步慢慢来。 (我不允许使用指针和 getchar 等)。
#include <stdio.h>
main()
{
char a[50];
int i;
printf("Give max 50 characters\n");
i=0;
do
{
scanf("%c", &a[i]);
i=i+1;
}
while((i<=50) && (a[i-1]!='[=10=]'));
for(i=0; i<50; i++)
printf("%c", a[i]);
}
这里没有任何以 nul 结尾的字符串,只有字符串数组。
因此,当按 enter 键时,a[i-1]
是 \n
而不是 [=13=]
(scanf
以 %c
作为参数不会以 nul 终止字符串,并且 ENTER 只是一个非空字符,代码为 10 AKA \n
)
然后不要打印字符串的其余部分,因为你会得到垃圾,只需在打印回字符串时重复使用 i
:
#include <stdio.h>
main()
{
char a[50];
int i;
printf("Give max 50 characters\n");
i=0;
do
{
scanf("%c", &a[i]);
i=i+1;
}
while((i<sizeof(a)) && (a[i-1]!='\n')); // \n not [=10=]
int j;
for(j=0; j<i; j++) // stop at i
printf("%c", a[j]); // output is flushed when \n is printed
}
同时使用 i<50
而不是 i<=50
进行测试,因为 a[50]
在数组边界之外(我已经概括为 sizeof(a)
)
您可以尝试使用此代码:
#include <stdio.h>
main()
{
char a[50];
int i;
printf("Give max 50 characters\n");
i=0;
do {
scanf("%c", &a[i]);
i=i+1;
} while(i<50 && a[i-1] != '\n');
a[i] = 0;
for(i=0; a[i] != 0; i++)
printf("%c", a[i]);
}
函数scanf("%c", pointer)
将一次读取一个字符并将其放置在pointer
位置。您正在寻找 '[=13=]'
,这是一个有效的字符串终止符,但是当您按 ENTER 时得到的换行符是 '\n'
.
此外,通过在末尾添加 '[=13=]'
(实际上是零)来终止您阅读的字符串是个好主意。然后用它来停止打印或者你可以打印一个未初始化的字符数组内容的"rest"。
这是您可以执行此操作的另一种方法。
#include <stdio.h>
// define Start
#define ARRAY_SIZE 50
// define End
// Function Prototypes Start
void array_reader(char array[]);
void array_printer(char array[]);
// Function Prototypes End
int main(void) {
char user_input[ARRAY_SIZE];
printf("Please enter some characters (50 max)!\n");
array_reader(user_input);
printf("Here is what you said:\n");
array_printer(user_input);
return 0;
}
// Scans in characters into an array. Stops scanning if
// 50 characters have been scanned in or if it reads a
// new line.
void array_reader(char array[]) {
scanf("%c", &array[0]);
int i = 0;
while (
(array[i] != '\n') &&
(i < ARRAY_SIZE)
) {
i++;
scanf("%c", &array[i]);
}
array[i + 1] = '[=10=]';
}
// Prints out an array of characters until it reaches
// the null terminator
void array_printer(char array[]) {
int i = 0;
while (array[i] != '[=10=]') {
printf("%c", array[i]);
i++;
}
}