C字符数组比较

C字符数组比较,c,C,好的,我在codewars.com上做了一个编码挑战,挑战是以一个字符串作为输入,返回一个字符串,其中代替字母的是与字母匹配的字母表的数字 除了字母以外的一切都是不容忽视的 例:aab将返回12 每个数字之间应该有一个空格,代表字母表中的一个字母 所以,当我在我的IDE上运行这段代码时,它是使用c99的xcode,一切看起来都很好,strcmp函数表示这两个字符串相等。 我所在的网站使用C11,我相信,但我不认为这是导致错误的原因 当我在challenge网站上运行此代码时,它通过了几个测试,但

好的,我在codewars.com上做了一个编码挑战,挑战是以一个字符串作为输入,返回一个字符串,其中代替字母的是与字母匹配的字母表的数字

除了字母以外的一切都是不容忽视的

例:aab将返回12

每个数字之间应该有一个空格,代表字母表中的一个字母

所以,当我在我的IDE上运行这段代码时,它是使用c99的xcode,一切看起来都很好,strcmp函数表示这两个字符串相等。 我所在的网站使用C11,我相信,但我不认为这是导致错误的原因

当我在challenge网站上运行此代码时,它通过了几个测试,但也失败了几个。当输入字符串为时,它会失败,对于我在下面代码中使用的字符串,它也会失败,但是当我在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;
}

你有两个严重的问题

首先,您没有将结果数组的内容初始化为空字符串。调用malloc后,添加:

malloc不会初始化它分配的内存。还有另一个函数calloc,它接受稍微不同的参数并将内存初始化为零。但是你只需要第一个字符是零,所以没有必要

其次,for循环不处理文本的最后一个字符。应该是:

for (i = 0; i < size; i++)
char *result = malloc(3 * size + 1);
您的分配是有效的,因为sizeofint通常至少为4,所以您分配的空间已经足够多了

还有其他不影响结果正确性的小问题:

您不需要专门处理“a”的if语句,else中的代码将适用于所有字母


最后不需要strcatresult,\0。结果必须以null结尾,才能将其用作strcat的参数,因此使用strcat添加null终止符毫无意义。

您有两个严重的问题

首先,您没有将结果数组的内容初始化为空字符串。调用malloc后,添加:

malloc不会初始化它分配的内存。还有另一个函数calloc,它接受稍微不同的参数并将内存初始化为零。但是你只需要第一个字符是零,所以没有必要

其次,for循环不处理文本的最后一个字符。应该是:

for (i = 0; i < size; i++)
char *result = malloc(3 * size + 1);
您的分配是有效的,因为sizeofint通常至少为4,所以您分配的空间已经足够多了

还有其他不影响结果正确性的小问题:

您不需要专门处理“a”的if语句,else中的代码将适用于所有字母


最后不需要strcatresult,\0。结果必须以null结尾,以便将其用作strcat的参数,因此使用strcat添加null终止符没有意义。

您从未初始化结果的内容,因此strcatresult,1;导致未定义的行为。为什么循环的大小仅为1?您正在忽略输入字符串的最后一个字符。不需要strcatresult,\0;。以前对strcat的所有调用都将添加一个空终止符。为什么对temp='a'有特殊情况?您的常规计算温度-'a'+1将适用于它。在malloc之后设置结果[0]=0。这将使它成为一个以null结尾的空字符串,然后您可以将它传递给“strcat”,因为您从未初始化result的内容,所以strcatresult,1;导致未定义的行为。为什么循环的大小仅为1?您正在忽略输入字符串的最后一个字符。不需要strcatresult,\0;。以前对strcat的所有调用都将添加一个空终止符。为什么对temp='a'有特殊情况?您的常规计算温度-'a'+1将适用于它。在malloc之后设置结果[0]=0。这将使它成为一个以null结尾的空字符串,然后您可以将其传递给“strcat”。感谢您花时间提供帮助,您消除了我对初始化字符数组的一些困惑,以及其中一些其他不必要的代码。我也不知道strcat添加了一个空终止符lol。我认为当输入不是以字母结尾时,这会引入一个微妙的错误。输出字符串的末尾将有一个额外的空格。是的。一个更简单的解决方案是在每个数字后放置空格,最后用空字节覆盖最后一个空格。另一种方法是在每个数字前写入空格,除非它是要打印的第一个数字。您的分配是有效的,因为sizeofint通常至少为4,所以您分配的空间足够多。,事实上,这解释了它在空字符串上失败的原因。感谢您花时间提供帮助,您消除了我的一些困惑
关于初始化字符数组以及其中一些其他不必要的代码。我也不知道strcat添加了一个空终止符lol。我认为当输入不是以字母结尾时,这会引入一个微妙的错误。输出字符串的末尾将有一个额外的空格。是的。一个更简单的解决方案是在每个数字后放置空格,最后用空字节覆盖最后一个空格。另一种方法是在每个数字前写入空格,除非它是要打印的第一个数字。您的分配是有效的,因为sizeofint通常至少为4,所以您分配的空间足够多。,实际上,这解释了为什么它在空字符串上失败。