一种ASCII算法给出了分段错误,而另一种算法没有';T

一种ASCII算法给出了分段错误,而另一种算法没有';T,c,math,ascii,cs50,C,Math,Ascii,Cs50,因此,如果我这样做,我会得到分段错误: #include <stdio.h> #include <cs50.h> int main(void) { string word = "WORD"; for(int i = 0; word[i] != 0; i++) { word[i] += 32; printf("%c", word[i]); } } 它按预期工作。给出了什么

因此,如果我这样做,我会得到分段错误:

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

int main(void) 
{
    string word = "WORD";

    for(int i = 0; word[i] != 0; i++) {
        word[i] += 32;
        printf("%c", word[i]);
    }
}

它按预期工作。给出了什么?

字符串
不是标准的C符号,可能在
cs50.h
头文件中定义为:

typedef char* string;
这意味着变量
word
是对常量数据的引用,这些数据不能更改。因此,当您尝试执行以下操作时:

word[i] += 32;

您试图更改无法写入的数据,因此出现seg故障。

字符串从何而来
string
在C中不是有效的关键字。假设
string
char*
typedef
word
指向内存的只读位置(包含
“word”
)。试图更改该空间的内容会调用未定义的行为(在您的特定情况下是分段错误)。但我不认为这是问题所在。在过去的十年里,头文件的可憎性让初学C的学生走上了错误的道路,这比学术界最底层的教师做的还要多。它是可怕的,完全没有必要的,而且不应该被用于一门课程,更不用说它已经存在多年了?不需要。请使用
tolower()
。明确地说,
char*
不是问题所在
“WORD”
是。另一方面,据我所知,char*不会引用常量数据?我喜欢将文字字符串标记为只读而不是常量,以避免出现
const
关键字的问题。字符串文字不是常量对象,它们是只读对象:-)@ILoveYeezis:
“WORD”
是变量所指向的常量数据。如果你有马洛克的记忆,结果会不同。@RobertHarvey严格地说,字符串不是问题所在。好的,谢谢。
word[i] += 32;