C

时间:2016-01-27 20:52:15

标签: c string

我的编程经验非常分散,我似乎无法找到答案,我希望这是一个简单的问题。上周我有一个任务,我没有完成任务,这让我感到很难过。

我应该在不使用strcmp的情况下按字母顺序比较两个字符串,并通过使用指针的函数首先找出字母顺序排列的字符串。

int strcmp373(char *str1, char *str2) {
  while(*str1 != '\0')
  {
    str1++;
  }
  while(*str2 != '\0')
  {
    str2++;
  }
if(*str1 == *str2)

}

这是我可怕的尝试,我的思考过程是使用空终止值。我希望能得到一些见解并解释它是如何运作的?

以下是转让规范的副本供参考。

编写一个名为strcmp373的函数,它比较两个字符串的方式与strcmp在C库中的完全相同。这次,请在编写此函数时使用“指针语法”。也就是说,在引用string1和string2中的特定字符时,根本不应该使用[]运算符;相反,所有参数和局部变量都应声明为指针(使用*符号)。请确保您模拟strcmp C函数。注意,如果两个字符串相等,strcmp返回0,即使0在C中通常表示为false。其他返回值的符号用于表示字符串不相同的方式,但精确的返回值并不重要。 您不能使用任何内置的C字符串库函数来完成此代码。

以下是此功能的原型:

int strcmp373(char *, char *);

这是一个可以用来测试strcmp373的主要功能。

#include <stdio.h>
#include "hw3.h" // to be discussed

int main() {
char str1[81], str2[81];
char again = 'y', newline;
while (again == 'y') {
    printf("Enter a string\n");
    scanf("%s", str1);
    printf("Enter another string\n");
    scanf("%s", str2);
    int comp = strcmp373(str1, str2);
    if (comp < 0)
        printf("%s is alphabetically before %s\n", str1, str2);
    else if (comp > 0)
        printf("%s is alphabetically after %s\n", str1, str2);
    else printf("%s and %s are the same\n", str1, str2);
    printf("Again? (y/n)\n");
    scanf("%c%c", &newline, &again);
}
}

2 个答案:

答案 0 :(得分:6)

假设str1指向持有“abcd”且str2指向持有“abc”的内容。

str1
|
v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

str2
|
v
+---+---+---+----+
| a | b | c | \0 |
+---+---+---+----+

执行时

while(*str1 != '\0')
{
  str1++;
}

移动str1直到它指向空字符。

str1
|
v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

    str1
    |
    v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

        str1
        |
        v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

            str1
            |
            v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

                str1
                |
                v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

同样,当你执行

while(*str2 != '\0')
{
  str2++;
}

移动str2直到它指向空字符。

str2
|
v
+---+---+---+----+
| a | b | c | \0 |
+---+---+---+----+

    str2
    |
    v
+---+---+---+----+
| a | b | c | \0 |
+---+---+---+----+

        str2
        |
        v
+---+---+---+----+
| a | b | c | \0 |
+---+---+---+----+

            str2
            |
            v
+---+---+---+----+
| a | b | c | \0 |
+---+---+---+----+

完成while循环后,str1str2都指向空字符。因此,*str1 == *str2始终评估为true

您需要比较*str1*str2,然后将它们相加,如果它们相等,直到它们不相等或者到达字符串的末尾。

str1
|
v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

str2
|
v
+---+---+---+----+
| a | b | c | \0 |
+---+---+---+----+

    str1
    |
    v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

    str2
    |
    v
+---+---+---+----+
| a | b | c | \0 |
+---+---+---+----+

        str1
        |
        v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

        str2
        |
        v
+---+---+---+----+
| a | b | c | \0 |
+---+---+---+----+

            str1
            |
            v
+---+---+---+---+----+
| a | b | c | d | \0 |
+---+---+---+---+----+

            str2
            |
            v
+---+---+---+----+
| a | b | c | \0 |
+---+---+---+----+

现在您知道它们不相等且'd'大于'\0'会返回一个正值,表明LHS按字母顺序大于RHS。

该逻辑可以使用以下方式实现:

while ( *str1 != '\0' && *str1 == *str2 )
{
   ++str1;
   ++str2;
}

return (*str1 - *str2);

答案 1 :(得分:0)

logFile.ignore(1000, ' ');

您的代码摘录中没有正文的if语句。

除了你的程序正在计算传递给该函数的字符数组中的字符数。这不会真正实现你的目标。

让我们为每个char数组调用一个单词。你想要做的是找到哪个&#39;字&#39;在字母表中排在第一位。我建议看一下ASCII表。

任一单词中的每个字母都有相应的ASCII数字值。如果您可以弄清楚如何访问每个字母的数字值,您可以比较字符串,较低的值将在字母表中更高。

除非他们资本化。这将需要更多的工作。这是一个ASCII表,您可以在其中看到差异。enter image description here

This will get you started with figuring out how to get the ASCII value of these letters