计算空白-C中的argc/argv

计算空白-C中的argc/argv,c,argv,C,Argv,我想计算空白,比如'(ASCII SP或32)。我必须使用命令行传递参数。例如,我输入Hello World并希望收到空白的数量,在这种情况下,结果应该是2 我已经试过了: Text=你好,世界 #include <stdio.h> #include <string.h> int main(int argc, char* argv[]){ int spaces = 0; char* mystring = argv[1]; int size = s

我想计算空白,比如
'
(ASCII SP或32)。我必须使用命令行传递参数。例如,我输入Hello World并希望收到空白的数量,在这种情况下,结果应该是2

我已经试过了: Text=你好,世界

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]){
    int spaces = 0;
    char* mystring = argv[1];
    int size = strlen(argv[1]) + strlen(argv[2]);
     for(int i = 0; i < size; i++){
         if((*(mystring + i)) == ' '){
             spaces++;
             printf("%d\n", spaces);
         }
     }
}
#包括
#包括
int main(int argc,char*argv[]){
int空间=0;
char*mystring=argv[1];
int size=strlen(argv[1])+strlen(argv[2]);
对于(int i=0;i
我知道
*(argv+1)
Hello
(或ASCII码)和
*(argv+2)
=
World
,这就是我的问题所在。如何计算
argv[n]
之间的空格?空格的数量可能不同,因此我不想像
If(argc>1){spaces++;}
那样编码

有人能帮忙吗

致以最良好的祝愿


Keita

以双引号的形式传递字符串,如“Hello World”。

以双引号的形式传递字符串,如“Hello World”。

如果执行:

$ a.out Hello      world # There are 5 spaces between both args here.
shell将通过将输入命令拆分为序列os spaces(一个连续的空格、制表符和/或换行符序列)位置的参数来提取命令的参数,并从imput中删除注释(如上面的注释),因此如果您发出上面的命令,您将得到如下
argv

int argc = 3;
char *argv[] = { "a.out", "Hello", "world", NULL, };
在使用引号分隔参数的情况下,可以发出

$ a.out "Hello     world"  # there are also 5 spaces between the words.
在这种情况下,您将得到如下结果:

int argc = 2;
char *argv[] = { "a.out", "Hello     world", NULL, };
在这种情况下,您将在参数中加入空格

重要的 您不检查传递给
a.out
的参数数量,因此在您发布的情况下,您可以尝试传递指向
strlen()
NULL
指针,这将导致未定义的行为。这是一个错误,为了使程序正常工作,您可以执行以下操作(我已更正了一些其他错误,并在代码中的注释中对其进行了注释):

最后,您有一个
头,它具有类似
isspace(c)
的函数,用于检查字符是否是空格(在本例中,它检查空格和制表符)

#include <stdio.h>
#include <ctype.h>

int main(int argc, char* argv[]){
    int spaces = 0;
    int arg_ix;
    for (arg_ix = 1; arg_ix < argc; arg_ix++) {
        char* mystring = argv[arg_ix];
        for(; *mystring != '\0'; mystring++) {
            if(isspace(*mystring)){
                spaces++;
            }
        }
     }
     printf("%d\n", spaces);
}
#包括
#包括
int main(int argc,char*argv[]){
int空间=0;
int arg_ix;
对于(arg_ix=1;arg_ix
如果执行:

$ a.out Hello      world # There are 5 spaces between both args here.
shell将通过将输入命令拆分为序列os spaces(一个连续的空格、制表符和/或换行符序列)位置的参数来提取命令的参数,并从imput中删除注释(如上面的注释),因此如果您发出上面的命令,您将得到如下
argv

int argc = 3;
char *argv[] = { "a.out", "Hello", "world", NULL, };
在使用引号分隔参数的情况下,可以发出

$ a.out "Hello     world"  # there are also 5 spaces between the words.
在这种情况下,您将得到如下结果:

int argc = 2;
char *argv[] = { "a.out", "Hello     world", NULL, };
在这种情况下,您将在参数中加入空格

重要的 您没有检查传递给
a.out
的参数数量,因此在发布的情况下,您可以尝试传递指向
strlen()
NULL
指针,这将导致未定义的行为。这是一个错误,为了使程序正常工作,您可以执行以下操作(我已更正了一些其他错误,并在代码中的注释中对其进行了注释):

最后,您有一个
头,它具有类似
isspace(c)
的函数,用于检查字符是否是空格(在本例中,它检查空格和制表符)

#include <stdio.h>
#include <ctype.h>

int main(int argc, char* argv[]){
    int spaces = 0;
    int arg_ix;
    for (arg_ix = 1; arg_ix < argc; arg_ix++) {
        char* mystring = argv[arg_ix];
        for(; *mystring != '\0'; mystring++) {
            if(isspace(*mystring)){
                spaces++;
            }
        }
     }
     printf("%d\n", spaces);
}
#包括
#包括
int main(int argc,char*argv[]){
int空间=0;
int arg_ix;
对于(arg_ix=1;arg_ix
您将无法执行此操作-参数解析首先由shell处理,它可能会清除任何多余的空格或其他分隔符。请尝试
executable.exe“Hello World”
当然可以使用引号,但用户不会在其字符串中添加任何引号,是否还有其他解决方案,或者我是否必须使用scanf/fgets?展示如何执行程序是绝对重要的(您尝试执行的命令行是什么)由于shell使用命令行中的空格分隔参数,因此可能不会占用任何空格。
*(mystring+i)
只是
mystring[i]
后者是两者中可读性更强的。您将无法执行此操作-参数解析首先由shell处理,它可能会清除任何多余的空格或其他分隔符。请尝试
executable.exe“Hello World”
当然可以使用引号,但用户不会在其字符串中添加任何引号,是否还有其他解决方案,或者我是否必须使用scanf/fgets?展示如何执行程序是绝对重要的(您尝试执行的命令行是什么)由于shell使用命令行中的空格分隔参数,因此可能不会占用任何空格。
*(mystring+i)
只是
mystring[i]
后者是两者中可读性更强的一种。这很有效,谢谢,但我想知道是否还有其他解决方案?因为用户通常不会在字符串中添加任何引号。@keita063,您无法通过shell剥离空格,因为这是一种正常机制,您无法访问已剥离的字符。唯一的解决方案是ion是为了避免引用空格,这是有效的,谢谢,但我想知道是否有