isalpha()无法正常工作

时间:2015-03-02 04:38:01

标签: c

我尝试使用for循环逐个字符地查看两个字符串并查看它们在哪里相等,它们在哪里不同,如果是这样的话,如果两个都是字母而不是我做一个条件,但是如果一个是一封信,一个是下划线,然后我做了别的。循环的第一部分工作正常;它可以判断两个值何时相等。但是,当我使用isalpha来查看它们是否都是不同的字母时,它就不会这样做。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
char s1[] = "v_intner_";
char s2[] = "wri_t_ers";


char* getTranscript(char* s1, char* s2){
    int i;
    char sOneTemp[9];
    char sTwoTemp[9];
    char eTranscript[9];
    strcpy(sOneTemp, s1);
    strcpy(sTwoTemp, s2);

    for(i=0; i<9; i++){
        if(sOneTemp[i]==sTwoTemp[i]){
            printf("Those two characters are equal.\n");
        }
        if(sOneTemp[i]!=sTwoTemp[i]){


            if(isalpha(sOneTemp[i]) && isalpha(sTwoTemp[i])){
                printf("Both are letters\n");
            }
            else{
                printf("One is a dash\n");
            }
        }
    }
printf("The value of s1 is: %s\n", sOneTemp);

return s1;}
main()
{
printf("The main method returns: %s", getTranscript(s1,s2));
return 0;
}

3 个答案:

答案 0 :(得分:2)

您的isalpha逻辑是正确的。但是你有一个缓冲区溢出:

char sOneTemp[9];
char sTwoTemp[9];

但是然后使用strcpy复制10个字符(记住C字符串有一个空终止符)。如果你修复了这个错误,那么代码会给出预期的输出。

一个好的解决方法是在函数内部使用s1s2,而不是冗余地复制输入字符串。

答案 1 :(得分:2)

您的程序受到未定义的行为的影响。要使用strcpy字符串"v_intner_",目标至少需要10个字符。您已创建仅包含9个字符的数组。

更改行:

char sOneTemp[9];
char sTwoTemp[9];

char sOneTemp[N]; // Where N is 10 or greater.
char sTwoTemp[N];

答案 2 :(得分:0)

char sOneTemp[9];
char sTwoTemp[9];
char eTranscript[9];
strcpy(sOneTemp, s1);
strcpy(sTwoTemp, s2);

您的数组大小不足以容纳10个字符,包括nul字符。因此,增加数组大小以包含空字符