strchr 在 C 中不工作
strchr not working in C
所以现在我正在尝试用 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
的 return 值:它 不是 return 字符的索引;相反,它 return 是指向您搜索的字符的 指针 。
char *p=strchr(string, '.');
char *q=strchr(string, '?');
char *e=strchr(string, '!');
此外,sizeof
不是return字符串的实际长度;它 returns 1000,这是 string
数组的大小。您需要改用 strlen
。
最后,string[strlen(string)-1]=='.'||'?'||'!'
不会将最后一个字符与三个字符之一进行比较。它总是 returns 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) {
...
}
strchr
returns 指针。
- 像
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]
并且它永远不会被写入,因为你告诉 fgets
string
只有 2 个元素。
a
用作 exit
的参数是不确定的。请初始化它。
length
未使用。
所以现在我正在尝试用 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
的 return 值:它 不是 return 字符的索引;相反,它 return 是指向您搜索的字符的 指针 。
char *p=strchr(string, '.');
char *q=strchr(string, '?');
char *e=strchr(string, '!');
此外,sizeof
不是return字符串的实际长度;它 returns 1000,这是 string
数组的大小。您需要改用 strlen
。
最后,string[strlen(string)-1]=='.'||'?'||'!'
不会将最后一个字符与三个字符之一进行比较。它总是 returns 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) {
...
}
strchr
returns 指针。- 像
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]
并且它永远不会被写入,因为你告诉fgets
string
只有 2 个元素。a
用作exit
的参数是不确定的。请初始化它。length
未使用。