' ',' \ n' ,scanf()和输出屏幕

时间:2014-10-06 10:34:07

标签: c string scanf stdio

我编写了以下代码来接受来自用户的字符并输入数组,直到他输入一个空闲空间('')或一行\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;
  }

请解释错误。

9 个答案:

答案 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)。

  1. 当您的输入是换行符(即ASCII值10)时。

    M =&#39; \ n&#39;

  2. 这里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;)之后输入换行符以输入并存储这些换行符并进行比较他们在下一行。