C 使用输入/输出标志每行显示一个单词的字符串

C 使用输入/输出标志每行显示一个单词的字符串,c,arrays,string,C,Arrays,String,我编写了一个程序,首先存储用户发送的任意数量的文本行。之后,它会检查一个新词何时出现,如果出现了,它会在新行中打印出来。 下面是我的代码: #include<stdio.h> #define IN 1 //inside a word #define OUT 0 //outside a word int main() { char s[100]; //storing the string entered by user int c; //get

我编写了一个程序,首先存储用户发送的任意数量的文本行。之后,它会检查一个新词何时出现,如果出现了,它会在新行中打印出来。 下面是我的代码:

 #include<stdio.h>
 #define IN 1   //inside a word
 #define OUT 0  //outside a word

int main()
{
  char s[100];   //storing the string entered by user
  int c;         //getchar reading variable
  int i=0;       //iterating variable

  while((c=getchar())!=EOF)
  {
    s[i++]=c;
  }
  s[i]='\0';   //end of string


  i=0;
  int p=0;    //stores the start of the word
  int current=OUT; //flag to indicate if program is inside or outside a word

  while(s[i]!='\0')  
  {
    if(current==OUT)  //when program is outside a word
    {
        if(s[i]!=' ' || s[i]!='\n' || s[i]!='\t')  //word found
        {
            p=i;  //store starting position of word 
            current=IN;
        }
    }
    else if(current==IN) //program is inside a word
    {
        if(s[i]==' ' || s[i]=='\n' || s[i]=='\t') //end of word found
        {
            current=OUT; //flag now outside the word
            for(int j=p;j<i;j++) //print from starting position of word
            {
                printf("%c",s[j]);
            }

            printf("\n");  //go next line

        }

    }
    ++i;  //incremnent the iterator variable
 }

return 0;
}
#包括
#在1//中定义一个单词
#在单词外定义0//
int main()
{
char s[100];//存储用户输入的字符串
int c;//getchar读取变量
int i=0;//迭代变量
而((c=getchar())!=EOF)
{
s[i++]=c;
}
s[i]='\0';//字符串结尾
i=0;
int p=0;//存储单词的开头
int current=OUT;//指示程序是在字内还是在字外的标志
而(s[i]!='\0')
{
if(current==OUT)//当程序在字外时
{
如果(s[i]!=''|s[i]!='\n'|s[i]!='\t')//找到单词
{
p=i;//存储单词的起始位置
电流=英寸;
}
}
else如果(current==IN)//程序在一个字内
{
if(s[i]=''||s[i]='\n'||s[i]='\t')//找到单词的结尾
{
current=OUT;//现在在单词外部标记

对于(int j=p;j向我跳出来的第一个bug:

if(s[i]!=' ' || s[i]!='\n' || s[i]!='\t')
将始终返回true。您需要
&&
,或者在使用其他位置的整个条件周围使用
!()
,以实现对称


或者更好的方法是,将其分解成一个函数,或者使用
中的
isspace

第一个向我跳出的bug:

if(s[i]!=' ' || s[i]!='\n' || s[i]!='\t')
将始终返回true。您需要
&&
,或者在使用其他位置的整个条件周围使用
!()
,以实现对称


或者更好的方法是,将其分解成一个函数,或者使用

中的
isspace
来确定字符是否为空格是不正确的过滤条件。
|
运算符意味着或。使用chained Or将允许表达式每次计算为true。您需要AND运算符
&
。当一个操作数的计算结果为false时,and运算符就会失败,或者在C中,
0

除此之外,还有更好的检查空白的方法。一种方法是使用中的
isspace
函数,该函数将字符接受为
int
,也可以是
无符号字符
,并确定该字符是否为
、'\t'、'\v'、'\n'或'\r'
中的任何字符。您还可以通过开关语句

switch(ch) {
    case ' ':
       // do something
        break;
    case '\n':
      //do something
        break;
}

确定字符是否为空白的筛选条件不正确。
|
运算符表示或。使用chained OR将允许表达式每次求值为true。您需要AND运算符
&&
。只要一个操作数求值为false,或在C情况下,
0
,AND运算符就会失败。

除此之外,还有更好的检查空白的方法。一种方法是使用中的
isspace
函数,该函数将字符接受为
int
,也可以是
无符号字符
,并确定该字符是否为
、'\t'、'\v'、'\n'或'\r'
中的任何字符。您还可以通过开关语句

switch(ch) {
    case ' ':
       // do something
        break;
    case '\n':
      //do something
        break;
}

太棒了!!我没有使用&operator,因为没有考虑额外的新行,程序进入了IN-word模式。纠正上述错误使程序按预期工作。谢谢。太棒了!!我没有使用&operator,因为没有考虑额外的新行,程序变为into在word模式下。纠正上述错误使程序按预期工作。谢谢。您对“任意”的限制较低:您对输入或输出的转换有问题吗?请提取a,这将极大地提高您问题的质量!您对“任意”的限制较低:DIs您的输入或输出转换有问题吗?请提取a,这将极大地提高您的问题质量!”使用isspace…它接受字符“-->详细信息:
是…(int ch)
函数接受
int
,其值在
无符号字符
EOF
范围内。“使用isspace…它接受一个字符”-->Detail:
是…(int ch)
函数接受一个
int
,其值在
无符号字符
EOF
范围内。