我从用户那里获得一个字符串,并将其存储在变量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;
a
和b
都是指针,它们最终只会指向内存中相同的常量字符串文字。没有发生复制。
这与get_string()
函数的结果相同,该函数为您动态分配了一个字符串,其中包含malloc()
。所以这段代码:
string plaintext = get_string("plaintext: ");
string plaintextLowercase = plaintext;
具有相同的";问题";。lowercase
和plaintextLowercase
只是指向同一内存区域的两个指针,包含相同的字符串。如果您想复制字符串,可以使用strdup()
:
string plaintext = get_string("plaintext: ");
string plaintextLowercase = strdup(plaintext);
当然,由于新字符串也是动态分配的,所以当您不再需要它时,不要忘记free()
:
free(plaintextLowercase);
get_string()
分配的字符串在库退出时会自动为您解除分配(还有另一件违背直觉的CS50事情(。