未定义的行为监管问题-CS50维格纳

未定义的行为监管问题-CS50维格纳,c,cs50,vigenere,C,Cs50,Vigenere,我正在研究Vigenere(CS50),当我用任何通过初始筛选的参数运行我的程序时,我会不断得到一个“UnfinedBehaviorSanitiser SEGV on Unknown Address” 我已经读过这个问题,但找不到解决办法。我尽可能地减少代码,发现即使在我做这部分的时候问题也会出现。问题在哪里? 非常感谢你 #include <cs50.h> #include <stdio.h> #include <stdlib.h> #include <

我正在研究Vigenere(CS50),当我用任何通过初始筛选的参数运行我的程序时,我会不断得到一个“UnfinedBehaviorSanitiser SEGV on Unknown Address”

我已经读过这个问题,但找不到解决办法。我尽可能地减少代码,发现即使在我做这部分的时候问题也会出现。问题在哪里? 非常感谢你

#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
,并验证它是否正常工作)。感谢您的详细解释。我几乎没有像我预料的那样发布这篇文章,我错过了一些基本的东西,我会觉得自己像个白痴,我没有错。谢谢你指出这一点,我会再试一次。谢谢你的详细解释。我几乎没有像我预料的那样发布这篇文章,我错过了一些基本的东西,我会觉得自己像个白痴,我没有错。谢谢你指出这一点,我会再试一次。