c-为什么更新一个变量同时更新分配给它的变量



我从用户那里获得一个字符串,并将其存储在变量plaintext中,然后我想在for循环中将该字符串转换为小写,并将它存储在单独的变量plaintextLowercase中。但是,当我将plaintextLowercase变量中的字符更改为小写时,plaintext变量也会发生同样的情况,我希望保持不变。我的代码在下面。

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

int main(void)
{
// get_string() is a function defined in the header file cs50.h that prompts the user for string input and returns that string input
string plaintext = get_string("plaintext: ");
string plaintextLowercase = plaintext;
//this converts the entire string to lowercase, but the issue is it is doing the same to the 'plaintext' variable as well
//I only want the 'plaintextLowercase' string to be lowercase, while the 'plaintext' variable
for (int i = 0, n = strlen(plaintext); i < n; i++)
{
plaintextLowercase[i] = tolower(plaintextLowercase[i]);
}
printf("%sn", plaintext);
printf("%sn", plaintextLowercase);
}

您使用的库混淆了无用的typedef和宏背后的基本C概念。如果你用C语言处理字符串,那么char *是唯一正确的方法。避免使用其他语言,特别是当你还在学习该语言的工作原理时。如果你的书/图书馆/课程建议你使用CS50的string之类的不透明数据类型,那么就把它扔掉,去找其他东西来研究。

这里发生的是,您的cs50.h标头将string定义为:

typedef char * string;

因此,你错误地给人的印象是做:

string a = "123";
string b = a;

将以某种方式神奇地创建字符串的副本。事实并非如此,因为代码等效于:

char *a = "123";
char *b = a;

ab都是指针,它们最终只会指向内存中相同的常量字符串文字。没有发生复制。

这与get_string()函数的结果相同,该函数为您动态分配了一个字符串,其中包含malloc()。所以这段代码:

string plaintext = get_string("plaintext: ");
string plaintextLowercase = plaintext;

具有相同的";问题";。lowercaseplaintextLowercase只是指向同一内存区域的两个指针,包含相同的字符串。如果您想复制字符串,可以使用strdup():

string plaintext = get_string("plaintext: ");
string plaintextLowercase = strdup(plaintext);

当然,由于新字符串也是动态分配的,所以当您不再需要它时,不要忘记free()

free(plaintextLowercase);

get_string()分配的字符串在库退出时会自动为您解除分配(还有另一件违背直觉的CS50事情(。

相关内容

  • 没有找到相关文章

最新更新