我正在使用C,我需要检查用户输入的第二个命令行参数argv [1]是否仅由字母表中的字母组成,如果没有,则执行else循环中的操作。我使用的是alpha函数但是当我编译并运行程序时,无论我的第二个命令行参数是什么(按字母顺序或其他方式),它总是执行“else循环”。我该如何解决这个问题?
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
int a = argc;
if (a != 2)
{
return 1;
}
string b = argv [1];
int c = strlen(b);
string m;
for (int i = 0; i < c; i++)
{
if (isalpha(b[c]))
{
m = GetString();
}
else
{
printf("Please provide a valid keyword\n");
return 1;
}
}
}
答案 0 :(得分:10)
尝试替换
if (isalpha(b[c]))
与
if (isalpha(b[i]))
目前,您正在检查索引处的元素,该元素是循环每次迭代时strlen(b)
的结果。因为基于C b[strlen(b)]
的数组索引为零,所以引用'\0'
,空终止符。
参考下面的Keith Thompson评论和this question的答案,您实际上应该将传递给isalpha
的值转换为unsigned char
,以确保不会调用未定义的行为。
因此,您应该将代码更改为
if (isalpha((unsigned char)b[i]))
确保没有UB
答案 1 :(得分:0)
使用isalpha(b[i])
代替isalpha(b[c])
像这样:
if (isalpha(b[i]))
{
m = GetString();
}