[英]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.