1
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数组相比,数组总是以某种方式“损坏” l_str2,无论调用顺序Lowercase_Strings或分配给任一数组的字符串如何。

例如,str1 = "MARY"andstr2 = "ARMY"将导致l_str2 = "army", 但l_str1 = "mary"最后有 2 个随机符号。

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

4

3 回答 3

4

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

在 for 循环的末尾添加以下行

l_str[i] = 0x00;

编辑:

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

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

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

于 2015-02-12T09:35:39.800 回答
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';
于 2015-02-12T09:36:05.173 回答
1

strlen()不计入终止空值。因此,在Lowercase_Strings()函数中,在 [outside]for循环之后,您需要添加

l_str[i] = `\0`;

以确保它以l_str空值终止。

此外,您可能希望通过使用来限制输入大小

 scanf("%20s", str1);       //read only 20 chars, 1 for null, total 21
 scanf("%20s", str2);       //read only 20 chars, 1 for null, total 21
于 2015-02-12T09:37:21.997 回答