C++ Strcmp没有';我不工作,我也不';我似乎不明白为什么转换为ASCII码会使程序按预期工作

C++ Strcmp没有';我不工作,我也不';我似乎不明白为什么转换为ASCII码会使程序按预期工作,c++,for-loop,c-strings,strncmp,floppy,C++,For Loop,C Strings,Strncmp,Floppy,首先,请不要批评程序的编写方式,因为这是我们在我的国家学习的内容 我知道它是C和C++的混合物,我用的东西已经过时了,但是事情就是这样。 所以我必须做一个程序,它可以输入n个单词。然后我必须打印最后一个作为前缀的单词 e、 g 这是我的节目。它按预期工作: #include <iostream> #include <string.h> using namespace std; int main() { int n; char a[100][100];

首先,请不要批评程序的编写方式,因为这是我们在我的国家学习的内容

我知道它是C和C++的混合物,我用的东西已经过时了,但是事情就是这样。 所以我必须做一个程序,它可以输入n个单词。然后我必须打印最后一个作为前缀的单词

e、 g

这是我的节目。它按预期工作:

#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] << " ";
        }
    }
}
我似乎无法理解为什么会发生这种情况。你们谁能帮我理解?另外,我应该使用转换为(unsigned int)还是仅使用strcmp

谢谢

 int strcmp(const char *s1, const char *s2);
strcmp
用于比较
string
string
。但是在你的代码中,你比较了
char
char
a[i][j]
a[n-1][j]

在您的情况下,可以使用仅比较两个字符串的前(最多)n个字节(在您的情况下,n是
strlen(a[n-1])
)的
strncmp

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] << " ";
        }
    }
for(int i=0;istrcmp
用于比较
string
string
。但是在代码中,您比较
char
char
a[i][j]
a[n-1][j]

在您的情况下,可以使用仅比较两个字符串的前(最多)n个字节(在您的情况下,n是
strlen(a[n-1])
)的
strncmp

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] << " ";
        }
    }
for(int i=0;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] << " ";
}
size_t p=strlen(a[n-1]);
对于(int i=0;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] << " ";
}
size_t p=strlen(a[n-1]);
对于(int i=0;i如果(strncmp(a[i],a[n-1],p)==0)可以对问题中代码的最简单更改是将测试从
if(strcmp(a[i][j],a[n-1][j])!=0更改为
if(a[i][j]!=a[n-1][j])
对问题中代码的最简单更改是将测试从
if(strcmp(a[i][j],a[n-1][j])<(代码)>(A[i] [j]!= [n[1] [j])< /> > 

如果C++代码中使用C部分,则仍然是C++。“转换为ASCII”是什么意思?在字符串的每个字符上不应该调用<代码> STRCMP <代码>。它已经比较字符串。@ USER 3121023,我比较每个字母。[I]的第一个字母[n-1 ]JohnSmith的第一个字母,例如:代码,>代码,StcMP < /Cord>是错误的工具,它比较字符串而不是字符。如果你在C++代码中使用C部分,它仍然是C++。?您不应该对字符串的每个字符调用
strcmp
。它毕竟已经比较了字符串。@user3121023我正在比较每个字母。a[I]的第一个字母与a[n-1]“的第一个字母,依此类推。@JohnSmith Then
strcmp
对于这项工作来说是错误的工具,它比较字符串而不是字符。谢谢。我甚至不知道strncmp的存在。谢谢。我甚至不知道strncmp的存在。即使你的答案稍微好一点,我也选择了另一个作为正确的工具,因为它更快。你能详细说明一下如何使用它吗?”“cstring”而不是“string.h”?据我所知,应该避免使用cstring(因为它已经过时了)@ JohnSmith是C++标准的一个要求。@ JohnSmith -代码> <代码>将在<代码> <代码>中声明的C函数的名称放入命名空间<代码>:ST::/COD>。它没有过时,没有理由避免。有人认为,整个C库应该被容忍,直到它能够被允许为止。删除。这一努力很快就失败了。即使你的答案稍微好一点,我还是选择了另一个作为正确答案,因为它更快。你能详细说明一下使用“cstring”而不是“string.h”吗?据我所知,应该避免使用cstring(因为它已经过时了)@ JohnSmith是C++标准的一个要求。@ JohnSmith -代码> <代码>将在<代码> <代码>中声明的C函数的名称放入命名空间<代码>:ST::/COD>。它没有过时,没有理由避免。有人认为,整个C库应该被容忍,直到它能够被允许为止。这项努力很快就失败了。