Strcmp 不起作用,我似乎不明白为什么 - 转换为 ASCII 代码使程序按预期工作
Strcmp doesn't work and I don't seem to understand why - transformation to ASCII code makes the program work as expected though
首先,请不要批评程序的编写方式,因为这是我们在我国学习的。
我知道它是 C 和 C++ 的混合体,我使用的东西已经过时了,但这就是这里的情况。
所以我必须编写一个程序,将 n 个单词作为输入。然后我必须打印最后一个作为前缀的单词。
例如
input:
n=6
raita grai raid raion straie rai
output:
raita raid raion
这是我的程序。它按预期工作:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int n;
char a[100][100];
bool ok=1;
cin >> n;
cin.get();
for (int i = 0; i < n; i++)
{
cin.get(a[i], 100);
cin.get();
}
int p = strlen(a[n - 1]);
for (int i = 0; i < n - 1; i++)
{
for(int j = 0; j < p; j++)
{
ok = 1;
if ((unsigned int)a[i][j] != (unsigned int)a[n-1][j])
{
ok = 0;
break;
}
}
if (ok == 1)
{
cout << a[i] << " ";
}
}
}
但最初,它看起来像这样:
/* strstr example */
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int n;
char a[100][100];
bool ok=1;
cin >> n;
cin.get();
for (int i = 0; i < n; i++)
{
cin.get(a[i], 100);
cin.get();
}
int p = strlen(a[n - 1]);
for (int i = 0; i < n - 1; i++)
{
for(int j = 0; j < p; j++)
{
ok = 1;
if (strcmp(a[i][j], a[n-1][j]) != 0)
{
ok = 0;
break;
}
}
if (ok == 1)
{
cout << a[i] << " ";
}
}
}
它会抛出一些错误:
Severity Code Description Project File Line Suppression State
Error (active) E0167 argument of type "char" is incompatible with parameter of type "const char *" ConsoleApplication1 25
Severity Code Description Project File Line Suppression State
Error C2664 'int strcmp(const char *,const char *)': cannot convert argument 1 from 'char' to 'const char *' ConsoleApplication1 25
我似乎不明白为什么会这样。你们中的任何人都可以帮助我理解吗?另外,我应该使用转换为 (unsigned int) 还是仅使用 strcmp?
谢谢。
int strcmp(const char *s1, const char *s2);
strcmp
用来比较string
和string
。但是在您的代码中,您比较 char
和 char
(a[i][j]
和 a[n-1][j]
)。
在你的情况下,你可以使用 strncmp
来比较两个字符串的前(最多)n 个字节(在你的情况下,n 是 strlen(a[n-1])
):
int strncmp(const char *s1, const char *s2, size_t n);
那么,你的程序就变成了下面这样:
for (int i = 0; i < n - 1; i++)
{
ok = 1;
if (strncmp(a[i], a[n-1], p) != 0)
{
ok = 0;
}
if (ok == 1)
{
cout << a[i] << " ";
}
}
在此声明中
if (strcmp(a[i][j], a[n-1][j]) != 0)
两个表达式 a[i][j]
和 a[n-1][j]
都具有 char 类型,而函数 strcmp
需要两个指向类型 char *
的字符串的指针。
所以编译器报错。
您可以使用标准函数 strncmp
简化您的第一个程序。例如
size_t p = strlen(a[n - 1]);
for (int i = 0; i < n - 1; i++)
{
if ( strncmp( a[i], a[n-1], p ) == 0 ) cout << a[i] << " ";
}
注意你应该使用header <cstring>
而不是header <string.h>
,
问题中代码的最简单更改是将测试从 if (strcmp(a[i][j], a[n-1][j]) != 0)
更改为 if (a[i][j] != a[n-1][j])
。
首先,请不要批评程序的编写方式,因为这是我们在我国学习的。
我知道它是 C 和 C++ 的混合体,我使用的东西已经过时了,但这就是这里的情况。
所以我必须编写一个程序,将 n 个单词作为输入。然后我必须打印最后一个作为前缀的单词。
例如
input:
n=6
raita grai raid raion straie rai
output:
raita raid raion
这是我的程序。它按预期工作:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int n;
char a[100][100];
bool ok=1;
cin >> n;
cin.get();
for (int i = 0; i < n; i++)
{
cin.get(a[i], 100);
cin.get();
}
int p = strlen(a[n - 1]);
for (int i = 0; i < n - 1; i++)
{
for(int j = 0; j < p; j++)
{
ok = 1;
if ((unsigned int)a[i][j] != (unsigned int)a[n-1][j])
{
ok = 0;
break;
}
}
if (ok == 1)
{
cout << a[i] << " ";
}
}
}
但最初,它看起来像这样:
/* strstr example */
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int n;
char a[100][100];
bool ok=1;
cin >> n;
cin.get();
for (int i = 0; i < n; i++)
{
cin.get(a[i], 100);
cin.get();
}
int p = strlen(a[n - 1]);
for (int i = 0; i < n - 1; i++)
{
for(int j = 0; j < p; j++)
{
ok = 1;
if (strcmp(a[i][j], a[n-1][j]) != 0)
{
ok = 0;
break;
}
}
if (ok == 1)
{
cout << a[i] << " ";
}
}
}
它会抛出一些错误:
Severity Code Description Project File Line Suppression State
Error (active) E0167 argument of type "char" is incompatible with parameter of type "const char *" ConsoleApplication1 25
Severity Code Description Project File Line Suppression State
Error C2664 'int strcmp(const char *,const char *)': cannot convert argument 1 from 'char' to 'const char *' ConsoleApplication1 25
我似乎不明白为什么会这样。你们中的任何人都可以帮助我理解吗?另外,我应该使用转换为 (unsigned int) 还是仅使用 strcmp?
谢谢。
int strcmp(const char *s1, const char *s2);
strcmp
用来比较string
和string
。但是在您的代码中,您比较 char
和 char
(a[i][j]
和 a[n-1][j]
)。
在你的情况下,你可以使用 strncmp
来比较两个字符串的前(最多)n 个字节(在你的情况下,n 是 strlen(a[n-1])
):
int strncmp(const char *s1, const char *s2, size_t n);
那么,你的程序就变成了下面这样:
for (int i = 0; i < n - 1; i++)
{
ok = 1;
if (strncmp(a[i], a[n-1], p) != 0)
{
ok = 0;
}
if (ok == 1)
{
cout << a[i] << " ";
}
}
在此声明中
if (strcmp(a[i][j], a[n-1][j]) != 0)
两个表达式 a[i][j]
和 a[n-1][j]
都具有 char 类型,而函数 strcmp
需要两个指向类型 char *
的字符串的指针。
所以编译器报错。
您可以使用标准函数 strncmp
简化您的第一个程序。例如
size_t p = strlen(a[n - 1]);
for (int i = 0; i < n - 1; i++)
{
if ( strncmp( a[i], a[n-1], p ) == 0 ) cout << a[i] << " ";
}
注意你应该使用header <cstring>
而不是header <string.h>
,
问题中代码的最简单更改是将测试从 if (strcmp(a[i][j], a[n-1][j]) != 0)
更改为 if (a[i][j] != a[n-1][j])
。