【问题标题】:Segmentation Fault in C command line arguments while trying to add to array尝试添加到数组时 C 命令行参数中的分段错误
【发布时间】:2020-11-25 12:40:33
【问题描述】:

我是 C 新手,当用户输入非字母键时,该程序应该输出 usage: ./substitution key。在密钥长度小于 27 个字母的情况下,它应该输出一条消息,即密钥长度必须为 26 个字母。如果用户没有输入,则生成第一条错误消息。不提供任何输入正在工作,并打印有效的错误消息。但是,如果我尝试提供其他输入,即向数组添加字符,则会显示分段错误。你能帮帮我吗?

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

int main(int argc, char*argv[argc])
{
    int counter = 0;
    if (argc==1)
    {
        printf("Usage: ./substitution key\n");
    }
    for (int i = 1;i <= argc; i++)
    {
        if (isalpha(argv[i]) != 0)
            continue;
        else
            counter++;
    }
    if (counter>1)
        printf("Usage: ./substitution key\n");
    else if (argc!=27 && argc!=1)
        printf("key must contain 26 characters.\n");
}

【问题讨论】:

  • argv 是字符串数组,而不是字符数组。 isalpha(argv[i]) 无效。
  • char*argv[argc] 应该是char*argv[]
  • 谢谢!我会改变的

标签: arrays c segmentation-fault command-line-arguments cs50


【解决方案1】:

您将超出数组边界。改变这个:

for (int i = 1 ;i <= argc; i++)

到这里

for (int i = 1 ;i < argc; i++)

你误用了 argv - 它是一个以 null 结尾的字符串数组。数组的大小为 argc,每个字符串的长度可以通过 strlen 函数获得。例如检查以下代码。

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

int main(int argc, char *argv[])
{
    if (argc == 1) {
        printf("Usage: ./substitution key\n");
    }

    const char *key = argv[1]; // for convenience
    int counter = 0;
    // count alphas
    while (isalpha(key[counter])) { ++counter; }
    // count length
    int len = strlen(key);

    // check if key consists of alphas
    if (counter != len) {
        printf("Usage: ./substitution key\n");
    }
    // check length
    if (counter != 26) {
        printf("key must contain 26 characters.\n");
    }
}

【讨论】:

  • 这实际上是没有越界访问。 argv[argc] 是有效的并且应该包含一个 NULL 指针来终止参数列表。但是当然循环应该更早停止一个元素,或者应该检查NULL
  • 该问题仅标记为 C。您可以将代码更新为有效的 C,而不是 C++。
猜你喜欢
  • 1970-01-01
  • 2014-05-29
  • 2014-03-22
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-16
  • 2020-11-19
相关资源
最近更新 更多