比较字符串c和字符差异

时间:2017-08-04 20:14:46

标签: c

我有一个学校作业来比较字符串。
比较不区分大小写,因此大写或小写是相同的。

如果字符串相等,则输出为第一个字符串。但是,如果字符串不相等,则输出是不同字符的数量。

实施例

Input:
    string1: LION 
    string2: lion 
Output: LION

Input: 
    string1: LION
    string2: LEON 
Output: 1 (because 'I' & 'E' is not equal)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
    int len, c, d, i, counter=0;
    char a[1000],b[1000];
    char *temp;
    scanf("%[^\n]s", a);
    scanf(" %[^\n]s", b);
    temp = (char *) malloc(strlen(a));
    strcpy(temp,a);
    len= strlen(a);
    for(i=0;i<len;i++)
    {
        c= tolower(a[i]);
        d= tolower(b[i]);
        if(c!=d) counter++;
    }

    if(counter) 
    {
        printf("%d\n",counter);
    } else {
        printf("%s\n",temp);
    }
    free(temp);
    return 0;
}

我已经创建了程序,但我的观点只有37.5 / 100或者我从8开始失败了5个测试用例。那么我的程序有什么问题?

3 个答案:

答案 0 :(得分:2)

您的代码很难理解 两个版本。首先计算差异并增加长度差异。 第二个只计算差异,如果长度不相等则返回-1 字符串相等时返回零

size_t my_strcmp(const char *str1, const char *str2)
{
    size_t result = abs(((int)strlen(str1) - (int)strlen(str2)));

    //or 
    //int slen1 = strlen(str1);
    //int slen2 = strlen(str2);
    //int result = slen1 > slen2 ? slen1 - slen2 : slen2 - slen1;

    while (*str1 && *str2)
    {
        if (tolower(*str1++) != tolower(*str2++))
        {
            result++;
        }
    }
    return result;
}
int my_strcmp(const char *str1, const char *str2)
{
    int result = (strlen(str1) != strlen(str2)) * -1;

    if (!result)
    {
        while (*str1)
        {
            if (tolower(*str1++) != tolower(*str2++))
            {
                result++;
            }
        }
    }
    return result;
}

并在主

int x;
switch((x = my_strcmp(string1, string2)))
{
  case -1:
    printf("The strings have a different length\n");
    break;
  case 0:
    printf("%s\n", string1);
    break;
  default:
    printf("Number of differences %d\n", x);
    break;
}

答案 1 :(得分:0)

首先,不需要对字符串进行任何操作,如果字符不同,则另外检查是否完成了大写或小写。

其次,如果字符串大小范围是10-1000,则在测试大小为1000的字符串时,\0需要额外的字符。

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

int main()
{
    char str1[1001];
    char str2[1001];
    int iter = 0;
    int i = 0;
    int diff=0;
    int counter = 0;
    int len1=0;
    int len2=0;
    scanf("%s", str1);
    scanf("%s", str2);
    len1 = strlen(str1);
    len2 = strlen(str2);
    iter = (len1 > len2)?len2:len1;

    for (i=0; i<iter; i++)
    {
        if (tolower(str1[i]) != tolower(str2[i]))
        {
                counter++;   
        }
    }
    diff = (len1 > len2)?len1:len2;
    counter += diff-iter;
    printf("%d\n", counter);
}
Input:
    LEON
    LeON
Output: 0


Input:
    LEON
    LION
Output: 1

Input:
    LEONEE
    LION
Output: 3

答案 2 :(得分:0)

以为我会抛弃另一种只使用1个大缓冲区的方法。

OP使用tolower()的方法很好。然而,没有必要用malloc()等复制字符串。此外,没有必要保留第二行输入。

关于空间和不匹配线路长度的编程目标不清楚。此代码通过使用fgets()读取用户输入行来处理空格,就像处理任何其他字符一样。使用不同的行长度输入时,此代码忽略了较长行的额外行。

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

int main(void) {
  char a[1000 + 1 + 1];  // +1 for \n, +1 for \0

  // scanf("%[^\n]s", a);
  if (fgets(a, sizeof a, stdin) == NULL) {
    puts("failed to read line");
    return (EXIT_FAILURE);
  }
  a[strcspn(a, "\n")] = '\0'; // trim potential trailing \n

  // now compare as code reads
  int i = 0;
  int counter = 0;
  int ch;
  while ((ch = fgetc(stdin)) != '\n' && ch != EOF) {
    if (a[i]) {  // If not at the end of the string
      if (tolower((unsigned char) a[i]) != tolower(ch)) { //cast useful w/negative `char`
        counter++;
      }
      i++; 
    }
  }

  if (counter) {
    printf("%d\n", counter);
  } else {
    printf("%s\n", a);
  }

  return 0;
}