我试图创建一个程序,从字符串中删除元音,将它们添加到矢量中,然后让用户再次拥有原始代码。
在我的代码中,我有这个:
char s[20];
在我进行这种比较后不久:
for(j=0;j<tam;j++)
{
if(strcmpi(s[j],"a")==1 ||
(strcmpi(s[j],"e")==1 ||
(strcmpi(s[j],"i") ==1||
(strcmpi(s[j],"o") ==1||
(strcmpi(s[j],"u")==1))
{
因此,如果数组是char并且元音是char(&#34;&#34;),为什么编译器会给我这个错误?:
[警告]传递`strcmpi&#39;的arg 1从没有强制转换的整数生成指针
修改
有人说正确的是s [j] ==&#39; a&#39;,但结果是错误的。如果放车,结果仍然是车。不知道为什么。
if(s[j] == 'a' ||
s[j] == 'A' ||
s[j] == 'e' ||
s[j] == 'E' ||
s[j] == 'i' ||
s[j] == 'I' ||
s[j] == 'o' ||
s[j] == 'O' ||
s[j] == 'u' ||
s[j] == 'U')
{
s[j] = s[j++]; }
答案 0 :(得分:5)
Strcmpi
用于比较字符串。 strcmpi
的第一个参数是char类型,当它需要char*
。
为了比较单个字符,s[j]=='e'
就足够了,或tolower(s[j])=='e'
如果您需要它不区分大小写。您需要ctype.h.
包含tolower
。
答案 1 :(得分:2)
strcmpi
的参数必须是字符串,但s[j]
只是一个字符,而不是字符串。您可以使用==
直接比较字符。要进行不区分大小写的比较,首先获取字符的小写版本并进行比较。
for (j = 0; j < tam; j++) {
char lower = tolower(s[j]);
if (lower == 'a' || lower == 'e' || lower == 'i' || lower == 'o' || lower == 'u') {
...
}
}
答案 2 :(得分:0)
您不想使用strcmp
或其任何变体。
因为您想知道字符串是否包含元音,所以您可能希望使用strstr
进行子字符串搜索。
答案 3 :(得分:0)
您错误地使用了函数strcmpi
。当您传递类型为const char *
的参数时,第一个参数的类型为char
。也就是说,当你只传递一个字符时,函数需要一个字符串。
此外,此功能不是标准的C / C ++功能。所以不应该使用它。
您可以使用以下方法获得相同的结果
char vowels[] = "aeiou";
//...
if ( strchr( vowels, tolower( s[j] ) )
{
std::cout << s[j] << " is a vowel" << std::endl;
}
答案 4 :(得分:0)
您已被告知strcmpi
不是检查单个字符的正确方法。这是对您的问题的编辑的答案,您可以询问实际剥离元音的问题。
如果要保留原始字符串,则需要额外的内存,而不需要辅音。您还需要两个索引,因为一旦跳过原始字符串中的元音,索引就会不同步。这是一个示例实现:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char orig[] = "Jackdaws love my big sphinx of quartz.";
char cons[sizeof(orig)]; // Make new char buffer as big
// as the original
int i, j;
j = 0;
for (i = 0; orig[i]; i++) {
if (strchr("AEIOUaeiou", orig[i]) == NULL) {
cons[j++] = orig[i];
}
}
cons[j] = '\0'; // Terminate consonant string
printf("was: '%s'\n", orig);
printf("is: '%s'\n", cons);
return 0;
}
表达式strchr
检查字符是否在字符串中。您可以将其用作快速拼写显式比较中的所有元音。