strcat 在尝试添加字符串和字符时不起作用?



我第一次使用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 终止。

最新更新