c - C字符数组比较
问题描述
好的,所以我在 codewars.com 上进行了编码挑战,挑战是将字符串作为输入并返回一个字符串,其中代替字母的是与字母匹配的字母的编号。
除了字母之外的所有东西都应该被忽略。
例如:“aab”将返回“1 1 2”
每个数字之间应该有一个空格,代表字母表中的一个字母。
因此,当我在我的 IDE(使用 c99 的 xcode)上运行此代码时,一切看起来都很好,并且strcmp()
函数说 2 个字符串相等。我相信我所在的网站使用 C11,但我没有看到导致错误的原因。
当我在挑战网站上运行此代码时,它通过了一些测试,但也失败了一些。当输入字符串为“”时它会失败,并且它也会在我在下面的代码中使用的字符串上失败,但是当我在我的 ide 上运行它时它也不会失败。
我的问题是:
1)知道是什么导致了这个错误吗?
2)就代码而言,您会做些什么不同的事情
谢谢
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char *alphabet_position(char *text)
{
int i,letter_position;
unsigned long int size = strlen(text);
char *result = malloc(sizeof(int)*size + 1);
char int_string[10];
char temp = ' ';
//If String wasn't blank
if (strcmp(text, "")!=0)
{
for (i=0; i<size-1; i++)
{
//If it is a letter
if (isalpha(text[i]))
{
temp = tolower(text[i]);
if (temp == 'a')
strcat(result, "1");
else
{
letter_position = temp - 'a' + 1;
sprintf(int_string,"%d",letter_position);
strcat(result, int_string);
}
//Print space after letter until the last letter
if (i!=size-2)
strcat(result, " ");
}
}
strcat(result, "\0");
return result;
}
else
{
strcat(result, "\0");
return result;
}
}
int main(void)
{
char *string = alphabet_position("The narwhal bacons at midnight.");
char *expected_output = "20 8 5 14 1 18 23 8 1 12 2 1 3 15 14 19 1 20 13 9 4 14 9 7 8 20";
printf("Your output %s\n", alphabet_position("The narwhal bacons at midnight."));
printf("Expt output %s\n", "20 8 5 14 1 18 23 8 1 12 2 1 3 15 14 19 1 20 13 9 4 14 9 7 8 20");
printf("\n");
printf("your len %lu\n", strlen(alphabet_position("The narwhal bacons at midnight.")));
printf("Expt len %lu\n", strlen(expected_output));
if (strcmp(string, expected_output)==0)
printf("Equal\n");
else
printf("Not equal\n");
return 0;
}
解决方案
你有两个严重的问题。
首先,您没有将result
数组的内容初始化为空字符串。调用后malloc()
,添加:
result[0] = '\0';
malloc()
不会初始化它分配的内存。还有另一个函数calloc()
采用稍微不同的参数并将内存初始化为零。但是你只需要第一个字符为零,所以没有必要。
其次,for
循环没有处理text
. 它应该是:
for (i = 0; i < size; i++)
同样,是否添加空格的测试应该是if (i != size-1)
。你认为strlen()
最后计算空字符吗?
您指定的空间量malloc()
不正确,但实际上不会导致问题。sizeof(int)
与显示整数值所需的字符数无关。由于您只是打印字母位置,因此最多为26
,因此每个输入字符需要 3 个字符。因此,它应该是:
char *result = malloc(3 * size + 1);
您的分配有效,因为sizeof(int)
通常至少为 4,因此您分配的空间足够多。
还有其他一些不影响结果正确性的小问题:
您不需要特殊if
处理的语句,您拥有的代码将适用于所有字母。'a'
else
最后你不需要strcat(result, "\0")
。result
必须已经以空值结尾才能将其用作 的参数,因此使用添加空值终止符strcat()
是没有意义的。strcat()
推荐阅读
- reactjs - 当我使用 history.goBack() 时,我无法从查询中触发 useEffect
- node.js - NodeJS 流(管道)数据到 Gcloud 存储
- java - 即使对讲开启,也需要获得所有手势
- django - 来自 2 个不同模型的 django 模型对象过滤器
- flutter - 创建实例时对空值使用的空值检查运算符
- assembly - 从内存程序集 i386 读取值时寄存器跳到高位
- python - 如何打印 y 轴大值
- json - 使用“接受:应用程序/json”请求 JSON 文件,给出“资源无法显示”错误
- node.js - 执行 SELECT * FROM "migrations_state" WHERE "key" = 时出错:没有为参数 1 指定值。db-migrate
- javascript - 成功 applyActionCode 后 currentUser.emailVerified 为 false - Firebase 版本 9