我是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 keyn");
}
for (int i = 1;i <= argc; i++)
{
if (isalpha(argv[i]) != 0)
continue;
else
counter++;
}
if (counter>1)
printf("Usage: ./substitution keyn");
else if (argc!=27 && argc!=1)
printf("key must contain 26 characters.n");
}
您正在脱离数组边界。更改此项:
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 keyn");
}
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 keyn");
}
// check length
if (counter != 26) {
printf("key must contain 26 characters.n");
}
}