我尝试使用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;
}
答案 0 :(得分:2)
您的isalpha
逻辑是正确的。但是你有一个缓冲区溢出:
char sOneTemp[9];
char sTwoTemp[9];
但是然后使用strcpy
复制10个字符(记住C字符串有一个空终止符)。如果你修复了这个错误,那么代码会给出预期的输出。
一个好的解决方法是在函数内部使用s1
和s2
,而不是冗余地复制输入字符串。
答案 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字符。因此,增加数组大小以包含空字符