为什么我的循环在 C 中的第一个参数(argv 的字符)处停止?
Why is my loop stopping at the first argument (char of argv) in C?
我不明白为什么我的代码在命令行参数的第一个字符处停止。
我认为问题出在循环中,我需要它来检查命令行参数是否为数字,因此第一部分和第二部分并不重要。
谢谢,抱歉打扰了,我是新手。
int main(int argc, string argv[])
{
// checking if there is more than one command-line argument
if (argc != 2)
{
printf("Usage: ./caesar key\n");
return 1;
}
else
{
// checking if command-line argument is a number
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
printf("%c\n", argv[1][i]);
if (isdigit(argv[1][i]))
{
return 0;
}
else
{
printf("Usage: ./caesar key\n");
return 1;
}
}
}
}
您正在 有效 案例中执行 return
,因此您 仅 检查 argv[1]
.
的第一个 个字符
您想不在有效情况下终止循环,累积值。
这是一些重构代码:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
// so we don't have to include cs50.h ...
typedef char *string;
int
main(int argc, string argv[])
{
// checking if there is more than one command-line argument
if (argc != 2) {
printf("Usage: ./caesar key\n");
return 1;
}
// checking if command-line argument is a number
int keyval = 0;
for (char *cp = argv[1]; *cp != 0; ++cp) {
if (! isdigit(*cp)) {
printf("Usage: ./caesar key\n");
return 1;
}
// accumulate the number as we go along, digit-by-digit
keyval *= 10;
keyval += (*cp - '0');
}
printf("keyval=%d\n",keyval);
return 0;
}
这是另一种方法:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
// so we don't have to include cs50.h ...
typedef char *string;
int
main(int argc, string argv[])
{
// checking if there is more than one command-line argument
if (argc != 2) {
printf("Usage: ./caesar key\n");
return 1;
}
// checking if command-line argument is a number
for (char *cp = argv[1]; *cp != 0; ++cp) {
if (! isdigit(*cp)) {
printf("Usage: ./caesar key\n");
return 1;
}
}
// we can use a standard function to get the value
int keyval = atoi(argv[1]);
printf("keyval=%d\n",keyval);
return 0;
}
这是另一种方式:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
// so we don't have to include cs50.h ...
typedef char *string;
int
main(int argc, string argv[])
{
// checking if there is more than one command-line argument
if (argc != 2) {
printf("Usage: ./caesar key\n");
return 1;
}
// checking if command-line argument is a number
char *cp;
int keyval = strtol(argv[1],&cp,10);
// invalid digit found
if (*cp != 0) {
printf("Usage: ./caesar key\n");
return 1;
}
printf("keyval=%d\n",keyval);
return 0;
}
请注意,strtol
将接受 负数 值(例如 -37
)作为有效值。因此,如果负值不可接受,我们需要额外检查 [就在 valid printf
]:
之前
// negative value found
if (keyval < 0) {
printf("Usage: ./caesar key\n");
return 1;
}
我不明白为什么我的代码在命令行参数的第一个字符处停止。 我认为问题出在循环中,我需要它来检查命令行参数是否为数字,因此第一部分和第二部分并不重要。 谢谢,抱歉打扰了,我是新手。
int main(int argc, string argv[])
{
// checking if there is more than one command-line argument
if (argc != 2)
{
printf("Usage: ./caesar key\n");
return 1;
}
else
{
// checking if command-line argument is a number
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
printf("%c\n", argv[1][i]);
if (isdigit(argv[1][i]))
{
return 0;
}
else
{
printf("Usage: ./caesar key\n");
return 1;
}
}
}
}
您正在 有效 案例中执行 return
,因此您 仅 检查 argv[1]
.
您想不在有效情况下终止循环,累积值。
这是一些重构代码:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
// so we don't have to include cs50.h ...
typedef char *string;
int
main(int argc, string argv[])
{
// checking if there is more than one command-line argument
if (argc != 2) {
printf("Usage: ./caesar key\n");
return 1;
}
// checking if command-line argument is a number
int keyval = 0;
for (char *cp = argv[1]; *cp != 0; ++cp) {
if (! isdigit(*cp)) {
printf("Usage: ./caesar key\n");
return 1;
}
// accumulate the number as we go along, digit-by-digit
keyval *= 10;
keyval += (*cp - '0');
}
printf("keyval=%d\n",keyval);
return 0;
}
这是另一种方法:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
// so we don't have to include cs50.h ...
typedef char *string;
int
main(int argc, string argv[])
{
// checking if there is more than one command-line argument
if (argc != 2) {
printf("Usage: ./caesar key\n");
return 1;
}
// checking if command-line argument is a number
for (char *cp = argv[1]; *cp != 0; ++cp) {
if (! isdigit(*cp)) {
printf("Usage: ./caesar key\n");
return 1;
}
}
// we can use a standard function to get the value
int keyval = atoi(argv[1]);
printf("keyval=%d\n",keyval);
return 0;
}
这是另一种方式:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
// so we don't have to include cs50.h ...
typedef char *string;
int
main(int argc, string argv[])
{
// checking if there is more than one command-line argument
if (argc != 2) {
printf("Usage: ./caesar key\n");
return 1;
}
// checking if command-line argument is a number
char *cp;
int keyval = strtol(argv[1],&cp,10);
// invalid digit found
if (*cp != 0) {
printf("Usage: ./caesar key\n");
return 1;
}
printf("keyval=%d\n",keyval);
return 0;
}
请注意,strtol
将接受 负数 值(例如 -37
)作为有效值。因此,如果负值不可接受,我们需要额外检查 [就在 valid printf
]:
// negative value found
if (keyval < 0) {
printf("Usage: ./caesar key\n");
return 1;
}