未定义的行为监管问题-CS50维格纳
我正在研究Vigenere(CS50),当我用任何通过初始筛选的参数运行我的程序时,我会不断得到一个“UnfinedBehaviorSanitiser SEGV on Unknown Address” 我已经读过这个问题,但找不到解决办法。我尽可能地减少代码,发现即使在我做这部分的时候问题也会出现。问题在哪里? 非常感谢你未定义的行为监管问题-CS50维格纳,c,cs50,vigenere,C,Cs50,Vigenere,我正在研究Vigenere(CS50),当我用任何通过初始筛选的参数运行我的程序时,我会不断得到一个“UnfinedBehaviorSanitiser SEGV on Unknown Address” 我已经读过这个问题,但找不到解决办法。我尽可能地减少代码,发现即使在我做这部分的时候问题也会出现。问题在哪里? 非常感谢你 #include <cs50.h> #include <stdio.h> #include <stdlib.h> #include <
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//int shift(char c);
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Usage: ./vigenere keyword");
return 1;
}
else
{
for (int i = 0; i < strlen(argv[1]); i++)
{
if (!isalpha(argv[1]))
{
printf("Usage: ./vigenere keyword");
return 1;
}
else
{
printf("All good!");
return 1;
}
}
}
}
#包括
#包括
#包括
#包括
#包括
//int移位(charc);
int main(int argc,字符串argv[])
{
如果(argc!=2)
{
printf(“用法:./vigenere关键字”);
返回1;
}
其他的
{
对于(int i=0;i
解决方案确实是可行的
if (!isalpha((unsigned char)argv[1][i]))
isalpha
函数/宏只接受一个整数,该整数必须具有单个字符的值,即无符号字符
。但是argv[1]
是指向多个字符的指针
现在,作为一个额外的复杂性,isalpha
通常被实现为一个宏,并且经常被编码,这样编译器就不会对错误类型的参数产生任何诊断。这是很不幸的,但是当你用C语言编程时,你只需要知道这些
也需要将char
转换为unsigned char
,如果不需要,则任何扩展字符(例如a
)都将在char
有符号的平台上调用未定义的行为,并且在x86处理器上它们是,因为该值将为负值,但是,isalpha
只需要一个EOF
的数字,或者一个小于或等于UCHAR\u MAX的非负数,修复确实是正确的
if (!isalpha((unsigned char)argv[1][i]))
isalpha
函数/宏只接受一个整数,该整数必须具有单个字符的值,即无符号字符
。但是argv[1]
是指向多个字符的指针
现在,作为一个额外的复杂性,isalpha
通常被实现为一个宏,并且经常被编码,这样编译器就不会对错误类型的参数产生任何诊断。这是很不幸的,但是当你用C语言编程时,你只需要知道这些
也需要将char
转换为unsigned char
,如果不需要,则任何扩展字符(例如a
)都将在char
有符号的平台上调用未定义的行为,并且在x86处理器上它们是,因为该值将为负值,但是isalpha
只需要一个EOF
的数字,或者一个小于或等于UCHAR\u MAX
argv[1]
的非负数。isalpha()
的参数必须是char
。它是如何编译的而没有关于类型不匹配的警告的?isalpha(argv[1])
应该是isalpha(argv[1][i])
。最准确地说,它应该是isalpha((unsigned char)argv[1][i])
,其他一切都是错误的,可能导致未定义的行为,包括您的崩溃。@Barmar不幸的是,GCC没有提供任何诊断。@我对您的问题投了赞成票,因为您已经成功地生成了一个几乎完全最小的示例,演示了问题和所有编译器诊断(没有),以及对所发生情况的解释。为了做得更好,您可以验证崩溃确实发生在isalpha
行上(您可以用1
替换整个调用,然后0
并验证它是否正常工作)。argv[1]
是字符串。isalpha()
的参数必须是char
。它是如何编译的而没有关于类型不匹配的警告的?isalpha(argv[1])
应该是isalpha(argv[1][i])
。最准确地说,它应该是isalpha((unsigned char)argv[1][i])
,其他一切都是错误的,可能导致未定义的行为,包括您的崩溃。@Barmar不幸的是,GCC没有提供任何诊断。@我对您的问题投了赞成票,因为您已经成功地生成了一个几乎完全最小的示例,演示了问题和所有编译器诊断(没有),以及对所发生情况的解释。为了做得更好,您可以验证崩溃确实发生在isalpha
行上(您可以将整个调用替换为1
,然后替换为0
,并验证它是否正常工作)。感谢您的详细解释。我几乎没有像我预料的那样发布这篇文章,我错过了一些基本的东西,我会觉得自己像个白痴,我没有错。谢谢你指出这一点,我会再试一次。谢谢你的详细解释。我几乎没有像我预料的那样发布这篇文章,我错过了一些基本的东西,我会觉得自己像个白痴,我没有错。谢谢你指出这一点,我会再试一次。