我是C语言的新手,我完成了一个小练习,即遍历传递给它的参数中的字母,并识别元音。初始代码只对一个参数(argv[1]
)有效。我想扩展它,使其能够遍历argv[]
中的所有参数,并重复相同的识别元音的过程。
代码:
#include <stdio.h>
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("ERROR: You need at least one argument.\n");
return 1;
}
if (argc == 2) {
int i = 0;
for (i = 0; argv[1][i] != '\0'; i++) {
char letter = argv[1][i];
if (letter == 'A' || letter == 'a') {
printf("%d: 'A'\n", i);
//so on
}
}
} else {
int i = 0;
int t = 2;
for (t = 2; argv[t] != '\0'; t++) {
for (i = 0; argv[t][i] != '\0'; i++) {
char letter = argv[t][i];
if //check for vowel
}
}
return 0;
}
}
我读了this answer,似乎最好的解决方案是使用指针,这个概念我仍然有点不确定。我希望有人能利用这个问题的上下文来帮助我更好地理解指针(通过解释在这个例子中如何使用指针来解决手头的问题)。提前非常感谢。
4条答案
按热度按时间0dxa2lsx1#
I was hoping someone could use the context of this question to help me understand pointers better....
In context of your program:
First, understand what is
argc
andargv
here.argc
(argument count): is the number of arguments passed into the program from the command line, including the name of the program.argv
(argument vector): An array of character pointers pointing to the string arguments passed.A couple of points about
argv
:argv[0]
represents the program name.argv[argc]
is a null pointer.For better understanding, let's consider an example:
Say you are passing some command line arguments to a program -
test
is the name of the executable file andhave
,a
,nice
andday
are arguments passed to it and in this case, the argument count (argc
) will be5
.The in-memory view of the argument vector (
argv
) will be something like this:A point to note about string (null-terminated character array) that it decays into pointer which is assigned to the type
char*
.Since
argv
(argument vector) is an array of pointers pointing to string arguments passed. So,We can also get the address of the first element of the array like this -
&argv[0]
.That means:
Similarly,
When you dereference them, you will get the string they are pointing to:
Similarly,
*(&argv[0])
can also written asargv[0]
.which means:
So,
When printing them:
And since the last element of argument vector is
NULL
, when we access -argv[argc]
we getNULL
.To access characters of a string:
To access the second character of string "have", you can use:
I hope this will help you out in understanding pointers better in context of your question.
To identify the vowels in arguments passed to program, you can do:
Output:
nnt7mjpx2#
你可以使用嵌套的for循环遍历所有参数。
argc
会告诉你参数的个数,而argv
包含数组的数组。我还使用了strings
库中的strlen()
函数。它会告诉你字符串的长度。这样你就可以检查任意个数的参数。你的 if 语句也可以改为2个。argc
小于2或大于2。嵌套循环的Python等效项
hlswsv353#
虽然您可以使用多个条件表达式来测试当前字符是否为元音,但创建一个常量字符串(其中包含要测试的集合的所有可能成员,此处为元音)并在元音字符串上循环以确定当前字符是否匹配通常是有益的。
您可以在
strchr
的呼叫中,直接使用常数字串做为测试的字串,以判断目前的字符是否为集合的成员,而不需要进行循环。下面的代码简单地使用一个循环和一个指针来迭代每个参数中的每个字符,并以类似的方式迭代常量字符串
char *vowels = "aeiouAEIOU";
中的每个字符,以确定当前字符是否是元音(处理小写和大写形式)。使用/输出示例
如果决定使用
string.h
中的strchar
函数来检查当前字符是否在vowels
集合中,则每个字符的内部循环将减少为:把东西看一遍,如果你还有问题,就告诉我。
eqzww0vc4#
如果其他人正在学习 Learn C The Hard Way,那么上述使用指针的答案已经远远超出我们了,因为我们要到第15章才会涉及指针。不过,你可以利用我们目前学到的知识来做这件事。我不会破坏这个乐趣,但是你可以使用for循环来处理参数,用嵌套的for循环来处理单词中的字母;从每个单词中得到一个字母就像
argv[j][i]
一样简单,其中j是传递的第j个参数,i是j中的第i个字母。不必导入头文件或使用指针。我不得不说,当我在第15章提到指针时,我确实回到了H.S的答案。