我有一个学校作业来比较字符串。
比较不区分大小写,因此大写或小写是相同的。
如果字符串相等,则输出为第一个字符串。但是,如果字符串不相等,则输出是不同字符的数量。
的实施例
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个测试用例。那么我的程序有什么问题?
答案 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;
}