簡體   English   中英

C字符數組比較

[英]C character array comparison

好的,所以我在codewars.com上進行了編碼挑戰,挑戰是將一個字符串作為輸入並返回一個字符串,其中代替字母的是與該字母匹配的字母的數字。

除字母以外的所有內容都將被忽略。

例如:“ aab”將返回“ 1 1 2”

每個數字之間應有一個空格,代表字母中的一個字母。

因此,當我在IDE(使用c99使用xcode)上運行此代碼時,一切看起來都很好,並且strcmp()函數表示兩個字符串相等。 我相信我使用的網站使用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,因此您分配的空間超過了足夠的空間。

還有其他一些小問題,它們不會影響結果的正確性:

您不需要專門處理'a'if語句, else的代碼將適用於所有字母。

您不需要最后的strcat(result, "\\0") result必須已經為null終止,以便您將其用作strcat()的參數,因此使用strcat()添加null終止符沒有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM