由于在 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 != ' ')

相反。