为什么我的程序不打印姓名的首字母?(CS50首字母缩写程序) #包括 #包括 #包括 #包括 int main(int argc,字符串argv[]) { int i=0; int x=0; int n=0; argv[i]=GetString() printf(“%c”,toupper(argv[i][0]); 对于(x=0,n=strlen(argv[i]);x
虽然您没有显示为什么我的程序不打印姓名的首字母?(CS50首字母缩写程序) #包括 #包括 #包括 #包括 int main(int argc,字符串argv[]) { int i=0; int x=0; int n=0; argv[i]=GetString() printf(“%c”,toupper(argv[i][0]); 对于(x=0,n=strlen(argv[i]);x,c,arrays,initializer-list,cs50,C,Arrays,Initializer List,Cs50,虽然您没有显示GetString()的定义,但我很确定您没有正确调用它,因为它后面没有分号,而且您几乎肯定不想覆盖argv[0]。使用调试符号编译(-g,在GCC中)在调试器中运行会告诉您哪行代码使程序崩溃 编辑:我猜当您尝试取消对argv[i+1]的引用时,您正在崩溃,即argv[1],一个NULL指针。但在调试器中运行可能会确认或取消确认这一点。您似乎将循环参数列表的语法与从标准输入读取一行的语法混为一谈。使用argv[0]保存指向sGetString()返回值的指针是不正常的功能,但实际上
GetString()
的定义,但我很确定您没有正确调用它,因为它后面没有分号,而且您几乎肯定不想覆盖argv[0]
。使用调试符号编译(-g
,在GCC中)在调试器中运行会告诉您哪行代码使程序崩溃
编辑:我猜当您尝试取消对
argv[i+1]
的引用时,您正在崩溃,即argv[1]
,一个NULL
指针。但在调试器中运行可能会确认或取消确认这一点。您似乎将循环参数列表的语法与从标准输入读取一行的语法混为一谈。使用argv[0]
保存指向sGetString()返回值的指针是不正常的
功能,但实际上并不非法
出现语法错误;GetString()
之后省略了分号
解决了这个问题后,导致崩溃的问题就出现在循环中的索引中;您正在索引argv[i+1][0]
,但是argv[1]
是一个空指针,除非您提供了命令行参数,并且访问空指针通常是一个崩溃(因此我们可以告诉您没有提供任何命令行参数)
您可以通过以下方式进行演示:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[])
{
int i=0;
int x=0;
int n=0;
argv[i]=GetString()
printf("%c", toupper(argv[i][0]));
for (x=0, n=strlen(argv[i]); x<n; x++)
{
printf("%c", toupper(argv[i+1][0]));
}
printf("\n");
}
示例运行
$。printf(“%c%c\n”,argv[1][0],argv[2][0]);
如果执行/a.out John Smith
。如果通过GetString()
输入,请不要使用argv。请注意,CS50代码在所有两个源文件(CS50.h
和CS50.c
)中都可用在一个zip文件中。它会突然出现一个相当大的数量。获得它将允许你编译并验证你对argv[i+1]
的观察。啊!我第一次听说CS50。我认为这是教授作为作业的一部分给出的东西。
$ ./initial xyz <<< "john smith"
JXXXXXXXXXX
$
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
int x = 0;
int n = 0;
string str = GetString();
printf("%c", toupper(str[0]));
for (x = 0, n = strlen(str); x < n; x++)
{
printf("%c", toupper(str[x]));
}
printf("\n");
free(str);
return 0;
}
$ ./initials <<< "john smith"
JJOHN SMITH
$