为什么我的函数只破坏了我的一个字符数组?

时间:2015-02-12 09:33:15

标签: c string null-terminated

int main() {
    char str1[21];
    char str2[21];
    char l_str1[21];
    char l_str2[21];

    printf("Please enter the first word: ");
    scanf("%s", str1);
    printf("Please enter the second word: ");
    scanf("%s", str2);

    Lowercase_Strings(str1, l_str1);
    Lowercase_Strings(str2, l_str2);

    printf("Lowercase string 1: %s", l_str1);
    printf("Lowercase string 2: %s", l_str2);

// Converts original strings to lower case, keeping original string unchanged
void Lowercase_Strings(char str[21], char l_str[21]) {
    char c;
    int i;

    for(i = 0; i < strlen(str); ++i) {
        c = str[i];
        l_str[i] = tolower(c);
    }
}

嘿伙计们!在这里新的,如果我对我的格式化有任何不妥之处,我不会介意批评。

这是我程序中的一个片段,用于检查两个字符串是否是彼此的字谜,不区分大小写。

然而,l_str1数组总是以#34;已损坏&#34;以某种方式与l_str2数组进行比较,无论调用Lowercase_Strings的顺序还是分配给任一数组的字符串。

例如,str1 = "MARY"str2 = "ARMY"会产生l_str2 = "army",但l_str1 = "mary"会产生2个随机符号。

如果有人知道发生了什么事情,我们将不胜感激。

3 个答案:

答案 0 :(得分:4)

您没有将NULL CHAR附加到转换后的字符串。

在for循环结束时添加以下行

l_str[i] = 0x00;

编辑:

1.数组的两个都没有初始化为任何值。

2. printf将打印到它在数组中找到null。

所以我只能在这里说你很幸运能够在你的阵列中的正确位置获得null,而在第二阵列中获得2个位置。 您在代码中所做的是未定义的行为,这可能会导致程序崩溃。

答案 1 :(得分:1)

char l_str1[21]="";
char l_str2[21]="";

确保您的字符串\0已终止。

我会说

 scanf("%s", str1);

不是一个好主意,而是使用fgets()。

size_t n;
fgets(str1,sizeof(str1),stdin);
n = strlen(str1)
if(n>0 && a[n-1] == '\n')
a[n-1] = '\0';

答案 2 :(得分:1)

strlen()不计算终止空值。因此,在Lowercase_Strings()函数中,在[{1}}循环的[外部]之后,您需要添加

for

确保l_str[i] = `\0`; 以空值终止。

此外,您可能希望使用

来限制输入大小
l_str