我正在处理Vigenere(CS50),并且在运行带有通过初始筛选的任何参数的程序时,始终获得“未知地址上的UndefinedBehaviorSanitiser SEGV”。
我已经阅读了此问题,但是找不到解决方案。我尽可能地缩减了代码,发现即使执行此部分操作也会出现问题。问题出在哪里?非常感谢。
#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;
}
}
}
}
解决方法的确是
if (!isalpha((unsigned char)argv[1][i]))
isalpha
函数/宏仅采用一个整数,该整数必须具有单个字符的值,如unsigned char
。但是argv[1]
是指向多个字符的指针!
现在非常复杂,isalpha
通常实现为宏,并且经常进行编码,因此编译器不会为错误类型的参数生成any诊断。不幸的是,但是当您使用C进行编程时,您只是需要知道这些。
也需要将char
强制转换为unsigned char
-如果不是,则任何扩展字符(例如ä
)都会在签署了char
的平台上调用未定义的行为-并且它们是] >在x86处理器上-因为该值将为负数,但isalpha
期望仅是EOF
或小于或等于UCHAR_MAX
的非负数。