c - 字符串按字母顺序排列的字符数

标签 c string

开发一个 C 程序来执行以下操作:

  • 创建两个包含 25 个元素的一维字符数组,分别命名为 first 和 secondary。
  • 要求用户输入两个字符串并将它们存储在数组 first 和 secondary 中。
  • 将两个数组传递给名为 countChars 的函数,该函数计算并打印每个字符串中的字符数。
  • 将两个数组传递给另一个名为 order 的函数,该函数确定并返回一个结果,该结果显示按字母顺序哪个字符串在另一个字符串之前。当主函数收到返回结果时,它会打印一条消息来显示它们的顺序。例如,如果第一个字符串是“green”,第二个字符串是“white”,则该函数确定绿色按字母顺序排列在白色之前。 main 函数打印一条语句: “按照字母顺序,\green\在\white\之前”。

代码:

#include<stdio.h>
#include<string.h>

int main() {
  char first[25], second[25];
  int length1, length2;
  printf("Enter the first and the second string: ");
  scanf("%s %s", first, second);
  length1 = strlen(first);
  length2 = strlen(second);
  order(first, second);
  return 0;
}

int order(char *first, char *second) {
  int i;
  for (i = 0; first[i] && second[i] && first[i] == second[i]; i++)
    if (first[i] && second[i]) {
      return 1;
    } else
      return 0;
}

最佳答案

order()的目标与 strcmp() 的功能匹配.

这是 order() 的快速解决方案是

int order(char *first, char *second) {
  return strcmp(first, second);
}
<小时/>

但也许目标是 re-invent the wheel .

@David C. Rankin评论过,运行字符串寻找差异。

然后使用常见的 C 习惯用法 (a > b) - (a < b)用于比较。这可以避免所有溢出问题 - 即使当类型为 char 时不太可能出现溢出问题。 .

// return 0 on match
// return 1: first > second
// return -1: first < second
int order(char *first, char *second) {
  while (*first && *second && *first == *second) {
    first++;
    second++;
  }
  return (*first > *second) - (*first < *second);
}
<小时/>

一些改进:

  • 使用const允许使用 const char * 调用函数以及 char *论据。

  • 无需测试*first*second .

  • 首先测试更有可能的不匹配,效率稍高。

  • 自由使用()可能有助于清楚地理解代码。

  • 比较为unsigned charstr...()函数将字符评估为 unsigned char ,即使char已签名。当对带有负数的字符串进行排序时,这会产生影响,而 OP 的数据不太可能出现这种情况。

.

int order_alt(const char *first, const char *second) {
  while ((*first == *second) && *first) {
    first++;
    second++;
  }
  return ((unsigned char)*first > (unsigned char)*second) - 
         ((unsigned char)*first < (unsigned char)*second);
}

关于c - 字符串按字母顺序排列的字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53894676/

相关文章:

c - GCC:禁止使用某些寄存器

java - java xml字符串之间的子字符串提取

c++ - swscanf_s 在读入 wchar_t 数组时导致错误

python - 防止 input() 为字母字符以外的任何内容

c - 在 switch 语句中使用枚举类型

c - 各个函数的内存分配?

python - 从与索引对齐的两个 pandas 系列中获取非空字符串值的有效方法

c - 将字符串分成更小的字符串

c++ - `(c = *str) != 0` 是什么意思?

c - 数组 K&R 1.6 个字符?