UndefinedBehaviorSanitiser问题-CS50 Vigenere

问题描述 投票:0回答:1

我正在处理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;
            }
         }
    }
}
c cs50 vigenere
1个回答
0
投票

解决方法的确是

if (!isalpha((unsigned char)argv[1][i]))

isalpha函数/宏仅采用一个整数,该整数必须具有单个字符的值,如unsigned char。但是argv[1]是指向多个字符的指针!

现在非常复杂,isalpha通常实现为宏,并且经常进行编码,因此编译器不会为错误类型的参数生成any诊断。不幸的是,但是当您使用C进行编程时,您只是需要知道这些。

也需要将char强制转换为unsigned char-如果不是,则任何扩展字符(例如ä)都会在签署了char的平台上调用未定义的行为-并且它们是] >在x86处理器上-因为该值将为负数,但isalpha期望仅是EOF或小于或等于UCHAR_MAX的非负数。

© www.soinside.com 2019 - 2024. All rights reserved.