我第一次使用C。我不能每次遇到大写字母时都附加字符串。我知道这在大多数语言中都非常简单,但我正在尝试用 C 语言学习它。
string s = get_string();
string s1 = "";
for (int i = 0, n = strlen(s); i < n; i++)
{
if (s[i] >= 'A' && s[i] <= 'Z')
{
strcat (s1,s[i]);
}
}
-颤抖- 我现在有两个理由抵制CS50。
- 它似乎在教您使用不合适的存储持续时间。
- 它教你使用不合适的类型别名。
C11/7.1.1p1 告诉我们,如果一个变量指向一个对象,则用这个typedef
声明的变量可以有意义地存储指向字符串的指针(指向字符串的指针是"指向其初始(最低寻址)字符的指针">),如果它指向存储符合非常特定模式的值序列的对象(字符串是"由第一个空字符终止并包括第一个空字符的连续字符序列">)。
您需要将指向可修改字符串的指针作为strcat
的第一个参数。就目前而言,您将指向字符串文本的指针作为第一个参数传递,正如其他人所说,这会导致未定义的行为。
下面是一个可修改的字符串:
char str[128] = "hello";
实际上,那里有 127 个可修改的字符串,它们有指向以下字符串的指针:
- 第一次
str + 0
或&str[0]
点 - 秒
str + 1
或&str[1]
点 - 依此类推,直到
- 在第 127 名
str + 126
或&str[126]
分 str + 127
或&str[127]
第 128 个点,但如果不越界访问str
并导致未定义的行为,则无法更改此(空)字符串。
你可以调用fgets(str, 128, stdin)
来获取一个字符串,其中可能包含换行符('n'
)字符(如果没有,则该行不完整)...用str[strcspn(str, "n")] = ' ';
剥离换行符,然后您可以使用strcat(str, (char[]){s[i], ' '});
...前提是您不会溢出数组。
strcat
的定义如下:char *strcat(char *dest, const char *src);
这意味着它只能将两个字符串相互连接。你可以做的(在现代 C 中)是这样的:
strcat(s1, (char[]){s[i], ' '});
不过你还有另一个问题;s1
是字符串文本。尝试将其与另一个字符串连接起来是未定义的行为。您必须创建一个数组或将其分配给堆才能正确使用它。
char s1[128];
或
char* s1 = malloc(128);
请注意,这些实现不能容纳大于 127 个字符的字符串,您必须自己添加 NUL 终止。