我编写了以下代码来接受来自用户的字符并输入数组,直到他输入一个空闲空间('')或一行\n
。但代码无法正常运行。如同在输入中按空格键或返回键时,我的计算机仍在接受值而不退出循环。
char X[99];
printf ("Type the string without spaces\n");
for (i=0;i<99;i++) {
scanf ("%c",&m);
if(m!=' '&&m!='\n')
X[i]=m;
else i=99;
}
请解释错误。
答案 0 :(得分:3)
首先是问题:默认的tty模式是规范的,意味着输入逐行可用(参见man termios
)
修复后,您可以使用getchar()或read()一次获取一个字符。 tty设置,直接来自termios的手册页。
#include <stdio.h>
#include <termios.h>
int ttySetNoncanonical(int fd, struct termios *prev)
{
struct termios t;
if (tcgetattr(fd, &t) == -1)
return -1;
if (prev != NULL)
*prev = t;
t.c_lflag &= ~ (ICANON);
t.c_cc[VMIN] = 1; // 1-char at a go
t.c_cc[VTIME] = 0; // blocking mode
if (tcsetattr(fd, TCSAFLUSH, &t) == -1)
return -1;
return 0;
}
void main(void) {
printf ("\nType the string without spaces\n");
ttySetNoncanonical(0,NULL); // set to non-canonical mode
char X[1000];
int m, ec=0;
int i;
X[0] = 0;
for (i=0;i<1000;i++) {
//ec = read(0,X+i,1); // read one char at a time
m = getchar();
if(m == EOF || m==' ' || m=='\n') {
X[i] = 0;
break;
}
X[i] = m;
}
printf("You entered %s. Bye.\n\n", X);
}
HTH。如果用户输入1000个字符,您可能需要检查边界条件。它适用于GNU Linux。
答案 1 :(得分:1)
scanf函数读取并忽略在下一个非空白字符(空格字符包括空格,换行符和制表符)之前遇到的任何空格字符。所以,而不是
scanf("%c",&m);
使用
m = getchar();
函数int getchar(void);从stdin获取字符,返回标准输入(stdin)中的下一个字符。它相当于用stdin作为参数调用getc。
此外,条件应使用逻辑AND,如:
if(m!=' '&& m!='\n')
此外,在循环外,写,
X[i] = '\0';
答案 2 :(得分:1)
使用getch(),scanf()将无法正常工作。
它会是这样的:
for(i=0;i<99;i++)
{
char ch=getch();
if(m!=' ' && m!='\n' && m!='\r')
X[i]=m;
else i=99;
printf("%c",ch);
}
答案 3 :(得分:1)
让我们看一下if条件
if(m!=' '||m!='\n')
1。当m是空间m =&#39; &#39; (即ASCII值32)
m=' '
根据你的if条件(Cond1 || Cond2),Cond1将失败,o / p将为0但是Cond2将为TRUE,因为它不是&#39; &#39 ;.
if(FALSE || TRUE)
将是if(TRUE)。
当您的输入是换行符(即ASCII值10)时。
M =&#39; \ n&#39;
这里Cond1将为TRUE,因为它不是SPACE,因此它不会根据C检查第二个条件,并将执行if(TRUE)语句。
请尝试自己编码....它会帮助你清除几个C疑惑,你会知道如何||和&amp;&amp;条件有效。
答案 4 :(得分:1)
当你逐个字符地阅读时,最好在这里使用getchar()而不是scanf。通常我们使用scanf来获取字符串作为输入。
使用逻辑运算符:&&
(AND)运算符检查一个条件是否为false,而||
(OR)运算符检查一个条件是否为真。因此,如果您使用&&
运算符,它会检查它是否为空格,如果不是,则返回false,甚至不检查第二个条件(EOF)。但是,如果您使用||
运算符(如下所示),则会检查这两种情况。在运营商here
在向阵列中添加项目(在if中)之后,您还必须递增计数器(i
),就好像你没有,它会不断地将项目添加到数组的同一位置,这意味着你将失去宝贵的投入。
所以,这是我的代码:
char X[99];
char m;
printf ("Type the string without spaces\n");
for (i=0;i<99;i++) {
m = getchar();
if(m == ' ' || m=='\n') {
X[i]=m;
i++;
}
else i=99;
}
答案 5 :(得分:0)
试试这个
#include <stdio.h>
int main(){
int i;
char m, X[99];
printf("Type the string without spaces\n");
for (i=0;i<98;i++){//98 --> sizeof(X) -1
scanf("%c",&m);
if(m!=' ' && m!='\n')
X[i] = m;
else
break;
}
X[i] = '\0';
puts(X);
return 0;
}
答案 6 :(得分:0)
使用函数getch();如果按下空格或输入就结束了!
#include <stdio.h>
int main(void) {
char m, X[99];
int i;
printf("Type the string without spaces\n");
for (i = 0; i < 99; i++) {
m = getch();
if (m == ' ' || m == '\n' || m == '\r')
i=100;
else
X[i] = m;
printf("%c", m);
}
}
答案 7 :(得分:-1)
第一个错误,正如每个人都指出的那样是if()
语句中的逻辑运算符。它应该是
if(m!=' ' && m!='\n')
如果您想检查输入的字符既不是(空格)也不是
\n
,那么您必须使用&&
运算符。
接下来,您得到的错误是因为trailing character
。当您输入一个字母并按enter
时(在scanf("%c",&m)
要求输入的位置)。该字母存储在变量m
中,但由\n
按下的换行符enter
仍在stdin
中。该字符由scanf("%c",&m)
循环的下一次迭代的for
读取,因此循环退出。
您需要做的是在执行下一个trailing character
之前使用scanf()
。为此你需要getchar()
来完成这项工作。所以现在你的代码就变成了这样......
#include<stdio.h>
int main()
{
char X[99];
char m;
int i;
printf("Type the string without spaces\n");
for (i=0;i<99;i++)
{
scanf("%c",&m);
if(m!=' ' && m!='\n')
{
X[i]=m;
getchar(); // this statement is consuming the left out trailing character
}
else
i=99;
}
printf("%s",X);
}
现在,该程序完全按照您的意愿运行。
答案 8 :(得分:-1)
这是一个有效的代码:
#include <stdio.h>
int main ()
{
char x[100] = {0};
char m;
int i, j;
printf ("Type:\n");
for (i=0; i<99; i++) {
m = getchar();
getchar();
if ((m != ' ') && (m != '\n')) {
x[i] = m;
} else {
printf ("Breaking.");
break;
}
}
printf ("\n");
for (j=0; j<i; j++)
printf ("%c\n", x[j]);
return 0;
}
这里我使用额外的getchar()来消耗用于输入字符m的换行符。所以(请注意)您还需要在空格(&#39;&#39;)和换行符(&#39; \ n&#39;)之后输入换行符以输入并存储这些换行符并进行比较他们在下一行。