首页 > 解决方案 > 分段故障铿锵

问题描述

我想做什么

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

int main(int argc, string argv[]) {
  for (int i = 0; i < strlen(argv[1]); i++) {
    if (isalpha(atoi(argv[i]))) {
      printf("Usage: ./caesar key\n");
      return 1;
    }
  }
  int k = atoi(argv[1]);
  if (argc == 2) {
    string pt = get_string("plaintext: ");
    printf("ciphertext: ");
    char ct[strlen(pt)];
    for (int i = 0; i < (strlen(pt)); i++) {
      if (isalpha(pt[i]) && isupper(pt[i])) {
        ct[i] = ((pt[i] - 65) + k) % 26;
        printf("%c", ct[i] + 65);
      } else if (isalpha(pt[i]) && islower(pt[i])) {
        ct[i] = ((pt[i] - 97) + k) % 26;
        printf("%c", ct[i] + 97);
      }
    }
    printf("\n");
  }

  else if (argc != 2) {
    printf("Usage: ./caesar keyn\n");
    return 1;
  }
}

如果我通过 20 倍,它必须告诉我(用法:./caesar),而不是我得到分段错误的原因!谁能帮助我,我会很感谢

标签: ccs50

解决方案


您的第一个循环遍历第一个命令参数中的字符数,并尝试访问该索引的命令参数。因此,如果您只有一个命令参数,但该参数有超过 2 个字符,那么您将尝试访问argv数组末尾之外的元素。


推荐阅读