CS50 PSET2:根本不知道如何实现 isalpha 以便检查每个命令行参数

Posted

技术标签:

【中文标题】CS50 PSET2:根本不知道如何实现 isalpha 以便检查每个命令行参数【英文标题】:CS50 PSET2 : Simply can't figure out how to implement isalpha so that each command line argument is checked 【发布时间】:2020-09-11 15:31:31 【问题描述】:

我根本不知道为什么我不能让 isalpha 为 Vigenere 的任务工作。我尝试了很多不同的输入。我是一个完全的编程初学者 - 就像 - 绝对的初学者,所以我想知道你是否有任何想法。我也尝试将 argv 和 argc 放入 isalpha 中,但它仍然没有我想要的输出。如果使用的关键字不是字母,则用户必须看到错误。这是我的代码:

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main(int argc, string argv[])


    
    if (argc < 2)    
    
    
        printf("ERROR \n");
        return 1;
    
    

     if (! isalpha (k[i]))
            
    
    else 
    
        string s = get_string("plaintext: ");
        int k = atoi(argv[1]);
        printf("ciphertext: ");
        for (int i = 0, n = strlen(s); i < n;  i++)
       
           
        if (isalpha(s[i]))
             printf("ERROR");
              
        if isupper(s[i])
             
                printf("%c", (((s[i] + k) - 65) % 26));
            
         
        else  if islower(s[i])
            
            
                printf("%c", (((s[i] + k) - 97) % 26)); 
            
            
        else 
            
                printf("%c", (s[i]));
            
          
        
    
    
     
        printf("\n"); 
    

        

【问题讨论】:

【参考方案1】:

您的源代码有许多错误。

 if (! isalpha (k[i]))
        

else 

这段代码有两个问题:

k 似乎是一个字符串,但在此用法之前从未声明 k。 如果 if 语句的计算结果为 TRUE,则不执行任何操作。 您似乎想要评估命令行参数以确定第一个字符是否为字母字符。您的程序不会评估命令行参数。它评估分配给 s 的用户输入的字符串。

当第一个字符可能是字母字符时,您尝试将第一个命令行参数转换为整数:

int k = atoi(argv[1]);

目前我不确定你认为 k 包含什么,但无论你认为它是什么,你都错了。您可能希望将除第一个字符以外的所有字符都转换为 int。

argv[1][0] 是什么样的数据,假设在启动程序时正确使用了命令行参数?您是在寻找两个特定的字符,还是任何字母字符就足够了?

【讨论】:

以上是关于CS50 PSET2:根本不知道如何实现 isalpha 以便检查每个命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vigenere cipherkey cs50 pset2 中重用(循环)密钥

CS50 Pset2。维吉内尔。大文本到低键,反之亦然问题

CS50 - pset2 - 维吉尼

Vigenere cs50 Pset2 末尾的额外字符

关于 CS50 pset2 vigenere

我的代码有啥问题? (Vigenere cypher cs50, pset2)