由于在 for 循环 [C] 中依次使用的条件中使用了 toupper,因此在给出非大写输入时出现分段错误
Segmentation fault when non-capitalized input is given due to toupper used in a condition which inturn is used inside a for loop [C]
我正在尝试为 CS50 课程编写程序,我需要在其中获取人员全名的首字母(并确保全名大写)。
因此,我最后写了这个:
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
//Asks user for input and checks for it's length
printf("What's your name?\n");
string full_name = get_string();
int name_length = strlen(full_name);
//Program to select the intitials of each word
for(int i=0; i<name_length; i++)
{
char selectedchar = full_name[i]; //determines the currently selected character from the string on the basis of how many times the loop has run
if(selectedchar != ' ') //Makes the program ignore any spaces before the name
{
if(selectedchar>='A' && selectedchar<='z')
{
printf("%c", toupper(full_name[i]));
}
else
{
printf("ERROR: INVALID INITIALS. (Check the characters used.)");
return 1;
}
}
//To skip printing of non-initials
while(selectedchar != ' ')
{
i++;
selectedchar=full_name[i];
}
if(i>=name_length) //print a linebreak on the end of each run
{
printf("\n");
return 0;
}
}
}
现在,每当我输入内容时,都会出现段错误。 E:
输入 Damien Chazelle 结果: DCSegmentation 错误(和换行)
输入 Dam!en Chazelle 结果: DCSegmentation 错误(和断线)
输入 Damien 结果: DSegmentation错误(和换行)
输入 !Damien 结果: 段错误(和换行)
现在,我是初学者!我完全不知道是什么导致了这个问题,也不知道如何正确地写这个问题。 (请原谅我!)
每次 space 不是字符串中的最后一个字符时,您的 while
循环将指针设置为下一个空白将 运行 超出范围:
while(selectedchar != ' ')
{
i++;
selectedchar=full_name[i];
}
假设一个像"Damien Chazelle"
这样的字符串,并且假设i
指向字符C
:那么,由于字符串不再包含从这个位置开始的space之后,i
将 运行 超出字符串范围。请注意,字符串终止字符 '[=17=]'
不等于 ' '
,因此循环将跳过。
在不过多解释其余代码的情况下,编写
while(i < name_length && selectedchar != ' ')
相反。
我正在尝试为 CS50 课程编写程序,我需要在其中获取人员全名的首字母(并确保全名大写)。
因此,我最后写了这个:
#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
//Asks user for input and checks for it's length
printf("What's your name?\n");
string full_name = get_string();
int name_length = strlen(full_name);
//Program to select the intitials of each word
for(int i=0; i<name_length; i++)
{
char selectedchar = full_name[i]; //determines the currently selected character from the string on the basis of how many times the loop has run
if(selectedchar != ' ') //Makes the program ignore any spaces before the name
{
if(selectedchar>='A' && selectedchar<='z')
{
printf("%c", toupper(full_name[i]));
}
else
{
printf("ERROR: INVALID INITIALS. (Check the characters used.)");
return 1;
}
}
//To skip printing of non-initials
while(selectedchar != ' ')
{
i++;
selectedchar=full_name[i];
}
if(i>=name_length) //print a linebreak on the end of each run
{
printf("\n");
return 0;
}
}
}
现在,每当我输入内容时,都会出现段错误。 E:
输入 Damien Chazelle 结果: DCSegmentation 错误(和换行)
输入 Dam!en Chazelle 结果: DCSegmentation 错误(和断线)
输入 Damien 结果: DSegmentation错误(和换行)
输入 !Damien 结果: 段错误(和换行)
现在,我是初学者!我完全不知道是什么导致了这个问题,也不知道如何正确地写这个问题。 (请原谅我!)
每次 space 不是字符串中的最后一个字符时,您的 while
循环将指针设置为下一个空白将 运行 超出范围:
while(selectedchar != ' ')
{
i++;
selectedchar=full_name[i];
}
假设一个像"Damien Chazelle"
这样的字符串,并且假设i
指向字符C
:那么,由于字符串不再包含从这个位置开始的space之后,i
将 运行 超出字符串范围。请注意,字符串终止字符 '[=17=]'
不等于 ' '
,因此循环将跳过。
在不过多解释其余代码的情况下,编写
while(i < name_length && selectedchar != ' ')
相反。