解决了一些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)。然而,无论插入什么作为参数,它似乎都失败了。
有什么想法吗?
答案 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。