如何回应用户输入并跳过标点符号和空格? (语言C)
How to echo user input and skip over punctuation and spaces? (Language C)
我的程序中回显用户输入的部分已经可以正常工作,但我的代码似乎忽略了 while 行,在该行中我指定不回显数组中的字符(如果它们是空格或标点符号)。我的代码如下:
#include <stdio.h>
int main()
{
int word = 0, punct = 0;
int i = 0;
char phrase[500];
printf("Enter any phrase.");
while (1)
{
do
{
phrase[i] = getchar(); //gets incoming char and outputs it
putchar(phrase[i]);
} while (phrase[i] != ' ' && phrase[i] != '.' && phrase[i] != '!' && phrase[i] != '@' && phrase[i] != '#' && phrase[i] != '$' && phrase[i] != '%' && phrase[i] != '%' && phrase[i] != '^' && phrase[i] != '&' && phrase[i] != '*' && phrase[i] != '(' && phrase[i] != ')' && phrase[i] != '-' && phrase[i] != '_' && phrase[i] != '=' && phrase[i] != '+' && phrase[i] != '\' && phrase[i] != '|' && phrase[i] != '{' && phrase[i] != '}' && phrase[i] != '[' && phrase[i] != ']' && phrase[i] != ':' && phrase[i] != ';' && phrase[i] != '\'' && phrase[i] != '\"' && phrase[i] != '<' && phrase[i] != '>' && phrase[i] != ',' && phrase[i] != '?' && phrase[i] != '/'); //prevents punctuation and spaces from bein outputted
printf("\n");
i++;
}
}
当我 运行 用户输入的程序全部回显时,包括标点符号和空格,究竟是什么错误以及我如何做到这一点以便代码逐字符输出所有内容并跳过标点符号和空格?跳过标点符号后如何继续循环?
//gets incoming char and outputs it
这条评论说明了一切。您的 do
循环会在 while
测试检查之前输出该字符。 while
仅在输入字符为标点符号时停止,但此时该字符已发送。然后外部 while (1)
循环导致整个事情再次发生。
解决此问题的方法是在 将其发送到输出之前测试字符 。例如:
while(1) {
phrase[i] = getchar();
if (isPunctuation(phrase[i]) == false) {
putchar(phrase[i]);
}
else {
printf("\n");
i++;
}
}
请注意,您真的不需要while (1)
,因为这意味着循环将永远持续下去。在第 500 个字符之后,您将超出 phrase
数组的容量并开始写入不属于您的内存。我会留给你想出一个更合理的循环条件。
我的程序中回显用户输入的部分已经可以正常工作,但我的代码似乎忽略了 while 行,在该行中我指定不回显数组中的字符(如果它们是空格或标点符号)。我的代码如下:
#include <stdio.h>
int main()
{
int word = 0, punct = 0;
int i = 0;
char phrase[500];
printf("Enter any phrase.");
while (1)
{
do
{
phrase[i] = getchar(); //gets incoming char and outputs it
putchar(phrase[i]);
} while (phrase[i] != ' ' && phrase[i] != '.' && phrase[i] != '!' && phrase[i] != '@' && phrase[i] != '#' && phrase[i] != '$' && phrase[i] != '%' && phrase[i] != '%' && phrase[i] != '^' && phrase[i] != '&' && phrase[i] != '*' && phrase[i] != '(' && phrase[i] != ')' && phrase[i] != '-' && phrase[i] != '_' && phrase[i] != '=' && phrase[i] != '+' && phrase[i] != '\' && phrase[i] != '|' && phrase[i] != '{' && phrase[i] != '}' && phrase[i] != '[' && phrase[i] != ']' && phrase[i] != ':' && phrase[i] != ';' && phrase[i] != '\'' && phrase[i] != '\"' && phrase[i] != '<' && phrase[i] != '>' && phrase[i] != ',' && phrase[i] != '?' && phrase[i] != '/'); //prevents punctuation and spaces from bein outputted
printf("\n");
i++;
}
}
当我 运行 用户输入的程序全部回显时,包括标点符号和空格,究竟是什么错误以及我如何做到这一点以便代码逐字符输出所有内容并跳过标点符号和空格?跳过标点符号后如何继续循环?
//gets incoming char and outputs it
这条评论说明了一切。您的 do
循环会在 while
测试检查之前输出该字符。 while
仅在输入字符为标点符号时停止,但此时该字符已发送。然后外部 while (1)
循环导致整个事情再次发生。
解决此问题的方法是在 将其发送到输出之前测试字符 。例如:
while(1) {
phrase[i] = getchar();
if (isPunctuation(phrase[i]) == false) {
putchar(phrase[i]);
}
else {
printf("\n");
i++;
}
}
请注意,您真的不需要while (1)
,因为这意味着循环将永远持续下去。在第 500 个字符之后,您将超出 phrase
数组的容量并开始写入不属于您的内存。我会留给你想出一个更合理的循环条件。