-1

因此,我将混合字母和数字的字符串数组与带有字母的数组进行比较,然后收集相似的字符(即:只有字母)并将其放入不同的字符串数组中,然后打印出来。

它第一次工作正常。虽然第二次,如果与字母表比较的字符串小于某个大小,它会塞满并显示一些额外的字母,有时还会出现一个不知从何而来的问号。

这是第一次输出:

Enter a string (1-40 characters): zxcvbnm,./asdfghjkl;qwertyuiop[]
Output: abcdefghijklmnopqrstuvwxyz

然后第二次:

Enter a string (1-40 characters): abcdefg
Output: abcdefgz?

明白了吗?“z?” 不知从何而来。

可能是缓冲区中有一些剩余的字母或再次调用该函数后的任何内容?

It turns out that I didn't have a null terminator at the end of the newest 
string before being printed! - Thanks to Mohamed!
4

3 回答 3

3

检查您的代码,您的字符串应以 null character 结尾'\0'。这是你的问题的原因。

在您的代码中,您必须添加

letters[z]= '\0';

之后for

    for (x = 0; x < 26; x++){
        for (y = 0; y < strLen1; y++){
            if (alphabet[x] == string[y])
            {
                letters[z]=string[y];
                /* Increment z, to insert anothe letter in an empty space. */
                z++;
            }
        }
    }
    letters[z]= '\0'; // add this line
    printf("Output: %s\n\n", letters);

顺便说一句,您可以优化您的字母检查

小写字母 {a, b, c, ......,z} 用它们的 ASCII 引用。

因此您可以检查 ASCIIstring[y]是否在 ASCII'a'和 ASCII之间,'z'而不是查看alphabet[]数组。它更简单

于 2013-03-25T15:39:47.837 回答
3

C 中的字符串是 NUL 终止的 您需要在打印之前终止字符数组。

将最后一个字符设置为'\0'.

于 2013-03-25T15:39:22.113 回答
0

你应该只isalpha()用来检查 achar是否是一个字母字符。无需重新发明,也无需手动转换为小写,因为它也可以处理。

于 2013-03-25T15:57:10.557 回答