argc,argv 在 C 中的 Null 终止符中导致奇怪的行为
argc, argv causes strange behavior in Null terminator in C
当我写:
#include <cs50.h> // includes type string
#include <stdio.h>
void trial(string a[])
{
if(a[2] == '[=10=]')
{
printf("Null\n");
}
}
int main(int argc, string argv[])
{
string a[] = {"1","2"};
trial(a);
}
字符串数组似乎没有以 Null 字符结尾。
但是当我写 int main(void) 时,它打印 "Null".
更奇怪的是,当我添加 return 0;到 int main(void) ,它不打印 "Null".
我不明白发生了什么,下面的 cs50 课程代码有效:
#include <stdio.h>
#include <cs50.h>
int len(string s)
{
int count=0;
while(s[count] != '[=11=]')
{
count++;
}
return count;
}
int main(int argc, string argv[])
{
string s = get_string("Input: \n");
printf("Length of the string: %d \n",len(s));
return 0;
}
我知道我们的数组之间的区别,我的是字符串数组,上面的代码是字符串,它是字符数组。但在一些帖子中,我看到字符数组不是以 null 结尾的。但也许在 cs50.h 中,他们将字符串实现为以空字符结尾的字符数组。我迷路了。
string a[] = {"1","2"}
是一个 2 元素数组。不会有隐藏的 NULL 指针附加到它。访问 a[2]
(可能是它的第三个元素)会使您的程序未定义。分析不同的变量如何影响行为未定义的程序没有多大意义。它可能因编译器而异。
#include <stdio.h>
int main(void)
{
//arrays of char initialized with a string literal end with '[=10=]' because
//the string literal does
char const s0[] = "12";
#define NELEMS(Array) (sizeof(Array)/sizeof(*(Array)))
printf("%zd\n", NELEMS(s0)); //prints 3
//explicitly initialized char arrays don't silently append anything
char const s1[] = {'1','2'};
printf("%zd\n", NELEMS(s1)); //prints 2
//and neither do array initializations for any other type
char const* a[] = {"1","2"};
printf("%zd\n", NELEMS(a)); //prints 2
}
当我写:
#include <cs50.h> // includes type string
#include <stdio.h>
void trial(string a[])
{
if(a[2] == '[=10=]')
{
printf("Null\n");
}
}
int main(int argc, string argv[])
{
string a[] = {"1","2"};
trial(a);
}
字符串数组似乎没有以 Null 字符结尾。
但是当我写 int main(void) 时,它打印 "Null".
更奇怪的是,当我添加 return 0;到 int main(void) ,它不打印 "Null".
我不明白发生了什么,下面的 cs50 课程代码有效:
#include <stdio.h>
#include <cs50.h>
int len(string s)
{
int count=0;
while(s[count] != '[=11=]')
{
count++;
}
return count;
}
int main(int argc, string argv[])
{
string s = get_string("Input: \n");
printf("Length of the string: %d \n",len(s));
return 0;
}
我知道我们的数组之间的区别,我的是字符串数组,上面的代码是字符串,它是字符数组。但在一些帖子中,我看到字符数组不是以 null 结尾的。但也许在 cs50.h 中,他们将字符串实现为以空字符结尾的字符数组。我迷路了。
string a[] = {"1","2"}
是一个 2 元素数组。不会有隐藏的 NULL 指针附加到它。访问 a[2]
(可能是它的第三个元素)会使您的程序未定义。分析不同的变量如何影响行为未定义的程序没有多大意义。它可能因编译器而异。
#include <stdio.h>
int main(void)
{
//arrays of char initialized with a string literal end with '[=10=]' because
//the string literal does
char const s0[] = "12";
#define NELEMS(Array) (sizeof(Array)/sizeof(*(Array)))
printf("%zd\n", NELEMS(s0)); //prints 3
//explicitly initialized char arrays don't silently append anything
char const s1[] = {'1','2'};
printf("%zd\n", NELEMS(s1)); //prints 2
//and neither do array initializations for any other type
char const* a[] = {"1","2"};
printf("%zd\n", NELEMS(a)); //prints 2
}