所以这是我到目前为止所拥有的:

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

int main(void)
{
   // creates variable string equal to input from user
   printf("what name?\n");
   string s = get_string();
   int n = strlen(s);


if (s != NULL)
{
    // iterates through string
    for (int i = 0; i < n; i++)
    {
        // checks string for space, if so adds to iterator to skip char
        while(s[i] == 32)
        {
            i++;
        }

        // checks if string is greater than or equal to 'A'
        if(s[i] >= 'A')
        {
            // prints Char and it's integer, then adds to iterator
            printf("%c", s[i]);
            i++;
            do {
                i++;
            } while (s[i] != 32);
        }
    }
}


}

无论如何都无法将两个单词分隔为不同的索引,我尝试使用'\ 0'。非常感谢您的帮助。我真的在尝试学习和理解我在哪里出错了。感谢您的帮助或建议。

最佳答案

这是您真正要出错的部分:

        do {
            i++;
        } while (s[i] != 32);


作为解释为什么大多数情况下会导致细分错误的示例,假设用户输入了John。那么s将是一个char数组,长度为5个元素,包含'J''o''h''n''\0'。这将发生:


在for循环中,您的代码将在'J'中找到s[0]并显示它。
然后它将i增加到1
然后它将进入您的do循环。
然后,将i增加到2并将s[2](即'h')与32进行比较。
由于'h'不等于' ',它将重复该循环,将i增加到3,然后将s[3](即'n')与32(与' '相同)进行比较)。
由于'n'不等于32,它将重复该循环,将i增加到4,并将s[4](即'\0')与32进行比较。
由于'\0'不等于32,它将重复该循环,将i增加到5,然后将s[5](超出数组末尾)与32进行比较。
然后它将继续重复该循环,并越来越多地进入内存,直到它偶然偶然发现32或遇到分段错误时,才应进入循环。

关于c - 尝试配置程序以从C中的字符串返回初始值,遇到段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44122757/

10-11 15:22
查看更多