因此,现在我正在尝试使用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或什至通过gets来存储它(我通过gcc很快学到了,有些研究方法都不可行)。

我完全迷失了为什么我在输入标点时不输入句子的情况下不起作用。

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

提前致谢。

最佳答案

您误解了strchr的返回值:它不返回字符的索引;而是返回指向您搜索的字符的指针。

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


另外,sizeof不会返回字符串的实际长度。它返回1000,这是string数组的大小。您需要改用strlen

最后,string[strlen(string)-1]=='.'||'?'||'!'不会将最后一个字符与三个字符之一进行比较。它总是返回1,因为?!的字符代码不为零,因此逻辑OR ||运算符将它们视为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) {
    ...
}

关于c - strchr无法在C中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33181328/

10-11 01:32