我的编程经验非常分散,我似乎无法找到答案,我希望这是一个简单的问题。上周我有一个任务,我没有完成任务,这让我感到很难过。
我应该在不使用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);
}
}
答案 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
循环后,str1
和str2
都指向空字符。因此,*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表,您可以在其中看到差异。
This will get you started with figuring out how to get the ASCII value of these letters