【问题标题】:Why I am not asked [i] times to input a string? [closed]为什么我没有被要求 [i] 次输入字符串? [关闭]
【发布时间】:2021-08-12 20:59:50
【问题描述】:

我目前在做CS-PSET2,我写了下面的代码。

一切正常,但现在我重新阅读它,我不明白为什么。

第 11 行有疑问:if(isdigit(argv [1][i]))

假设我写了"35",第一个字符是一个数字,所以循环是真的,它开始 --> 我必须写一个字符串(第 16 行)。

现在程序会检查第二个字符“5”,它是一个数字,是的-->理论上我必须再写一个字符串。

但为什么不呢?为什么我没有得到双倍的结果?

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

int main (int argc , string argv [])
{
    if (argc == 2 && isdigit(argv [1]))
    {
        int n = strlen(argv [1]);
        for (int i=0; i<n; i++)
        {
            if(isdigit(argv [1][i]))
            {
                 string plaintext = get_string("Plaintext: ");
                 int key = atoi(argv[1]);
                 int l = strlen(plaintext);
                 for(int p=0; p <l; p++) 
                 if isupper(plaintext[p])
                 {
                     printf("%c", (((plaintext[p] - 'A') + key) % 26) + 'A');
                 }
                 else if islower(plaintext[p])
                 {
                     printf("%c", (((plaintext[p] - 'a') + key) % 26) + 'a');
                 }
                 else 
                 {
                     printf("%c", plaintext[p]) ;
                 }
                 return 0;
            }
            else
            {
                printf("Nope\n");
                return 1;
            }
        }
    }
    else
    {
        printf("Nope\n");
        return 1;
    }
}

【问题讨论】:

  • int main (int argc , string argv []) 是可疑的,但如果 stringchar* 的别名,则可以。但是isdigit(argv [1]) 甚至不应该编译,因为isdigit() 需要int 而不是char*。而int key = atoi(argv[1]); 会将整个"35" 转换为一个int 35,这是你真正想要的吗?还是您只想转换单个数字 35?因为atoi() 不能在不将它们分别放入带有空终止符的char[2] 数组的情况下做到这一点。
  • @RemyLebeau 仅供参考,string 绝对别名为char*。这是cs50.h 为聚会带来的众多(非)“有用”的东西之一,最终完全让 C 的新手感到困惑。
  • 您是编译为 C 还是 C++?它们是不同的语言。 C++ 语言有std::string,定义在&lt;string&gt;。 C 语言只有字符数组。
  • 您应该总是for 循环之后使用大括号。它使阅读更容易,编码更容易。查看您的 for (int p= 0 循环。

标签: c cs50


【解决方案1】:

if 中有一个 return 0; 语句,用于检查数字。这将导致它在再次循环之前返回。只需摆脱该回报。

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 2014-02-21
    • 1970-01-01
    • 2019-04-26
    • 2013-03-22
    相关资源
    最近更新 更多