gpt4 book ai didi

c - isalpha 检查参数导致段错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:59:26 24 4
gpt4 key购买 nike

正在解决一些 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 跳过我的 return(1)。但是,无论作为参数插入什么,它似乎都会失败。

有什么想法吗?

最佳答案

使用 -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 **)。相反,您可能希望用户传入一个字符串作为一个参数并遍历该字符串(即 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;
}
}

请注意,我只是检查 isalpha 是否为真,而不是是否为 1。那是因为 isalpha returns non-zero if the character tests true .不能保证它会是 1。

关于c - isalpha 检查参数导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40392712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com