isalpha检查参数导致分段错误

时间:2016-11-03 02:06:36

标签: c

解决了一些C问题,并且遇到了问题。我可以想到另外一两种方式,但我想更好地理解为什么我的支票失败。

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

int main(int argc, char *argv[256]){
    //Require one alpha only argument if else exit 1
    if(argc < 2){
        printf("Usage: ./vigenere arg1 [arg2] [arg3]...\n");
        return 1;
    }
    for (int i=1;i<argc;i++){
        if(isalpha(argv[i]) == 1){
            return 1;
        }
        printf("%d\n",i);
    }

    //Prompt the user for some plaintext

    //Rotate plaintext by argument

    //Print Rotated Text

    // exit 0
}

脚本按预期工作,直到isalpha()行。我假设其中包含非字母字符的argv会!= 0 ergo跳过我的返回(1)。然而,无论插入什么作为参数,它似乎都失败了。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

使用-Wall打开警告。

cc -Wall -g test.c   -o test
test.c:13:20: warning: incompatible pointer to integer conversion passing 'char *' to parameter of
      type 'int' [-Wint-conversion]
        if(isalpha(argv[i]) == 1){
                   ^~~~~~~
/usr/include/ctype.h:218:13: note: passing argument to parameter '_c' here
isalpha(int _c)
            ^
1 warning generated.

问题在于这个循环。

for (int i=1;i<argc;i++){
    if(isalpha(argv[i]) == 1){
        return 1;
    }
    printf("%d\n",i);
}

您似乎认为argv是一个字符串(即。char *),而argc是该字符串的大小。因此,您要循环浏览argv中的所有字符。

但是argv是一个字符串列表(即char **)。相反,您可能希望用户将字符串作为一个参数传递并迭代(即{。{1}})检查非字符字符。

argv[1]

请注意,我只是检查if(argc < 2){ fprintf(stderr, "Usage: %s <string>\n", argv[0]); return 1; } char *input = argv[1]; for(int i = 0; i < strlen(input); i++) { if( isalpha(input[i]) ) { return 1; } } 是否属实,而不是{1}因为isalpha returns non-zero if the character tests true。不保证会是1。