-1

所以现在我正在尝试用 C 编写一个程序,它接受一个字符串并检查正确的标点符号(例如以'.'、'?' 或'!' 结尾)。我正在尝试使用 strchr 函数来测试并查看字符串中的最后一个字符是否是在 for 循环中使用 if 循环的标点符号之一。但是,当我运行程序时,它似乎一起跳过了 if 循环。

这是程序:

#include<stdio.h>
#include<string.h>

int main(void)
{
 char string[1000];
 int i,length,a,p,q,e;

 printf("Please enter a sentence with a valid punctuation.\n\n");


 for(i=0;i<1000;i++)
 {
  fgets(string,2,stdin);
  p=strchr(string,'.');
  q=strchr(string,'?');
  e=strchr(string,'!');
  if(string[sizeof(string)-1]=='.'||'?'||'!')
  {
   printf("\nYay a sentence!");
   break;
  }
  else if((p && q && e)==NULL)
  { 
   printf("You didn't provide any punctuation. Goodbye.");
   exit(a);
  }
 }
 printf("You entered the sentence:\n %s",string);

 return 0;
}

我已经尝试了很多不同的方式,例如尝试 strstr ,甚至通过 get 以不同的方式存储它(我通过 gcc 很快了解到,一些研究不是要走的路。)

当我输入一个没有标点符号的句子时,我完全不知道为什么这不起作用。

抱歉,如果这真的很简单,我对此很陌生。

提前致谢。

4

2 回答 2

2

您误解了 的返回值strchr:它不返回字符的索引;相反,它返回一个指向您搜索的字符的指针。

char *p=strchr(string, '.');
char *q=strchr(string, '?');
char *e=strchr(string, '!');

另外,sizeof返回字符串的实际长度;它返回 1000,这是数组的大小。你需要改用。stringstrlen

最后,string[strlen(string)-1]=='.'||'?'||'!'不将最后一个字符与三个字符之一进行比较。它总是返回1,因为?和的字符代码!不为零,因此逻辑或||运算符将它们视为true值。

条件也是如此(p && q && e)==NULL):它不检查所有三个值是否都是NULL; 其中之一NULL足以产生平等,但这不是你想要的。

这是您解决此问题的方法:

char last = string[strlen(string)-1];
// Skip '\n's at the end
while (last != 0 && (string[last] == '\n' || string[last] == '\r')) {
    last--;
}
if (last == '.' || last == '?' || last == '!') {
    ...
}
// Using implicit comparison to NULL is idiomatic in C
if (!p && !q && !e) {
    ...
}
于 2015-10-17T00:19:54.103 回答
0
  • strchr返回指针。
  • 像这样的表达hoge==a||b||c很奇怪。您必须分别编写它们。

固定代码:

#include<stdio.h>
#include<string.h>

int main(void)
{
 char string[1000];
 int i,length,a;
 char *p,*q,*e;

 printf("Please enter a sentence with a valid punctuation.\n\n");


 for(i=0;i<1000;i++)
 {
  fgets(string,2,stdin);
  p=strchr(string,'.');
  q=strchr(string,'?');
  e=strchr(string,'!');
  if(string[sizeof(string)-1]=='.'||string[sizeof(string)-1]=='?'||string[sizeof(string)-1]=='!')
  {
   printf("\nYay a sentence!");
   break;
  }
  else if(p==NULL&&q==NULL&&e==NULL)
  { 
   printf("You didn't provide any punctuation. Goodbye.");
   exit(a);
  }
 }
 printf("You entered the sentence:\n %s",string);

 return 0;
}

笔记:

  • string[sizeof(string)-1]将是不确定的,因为它意味着string[999]它永远不会被写入,因为你告诉fgetsstring只有 2 个元素。
  • a用作的参数exit是不确定的。请初始化它。
  • length未使用。
于 2015-10-17T00:25:56.390 回答