gpt4 book ai didi

c - C语言中如何给字符串赋值

转载 作者:行者123 更新时间:2023-11-30 21:27:54 25 4
gpt4 key购买 nike

打印变量“fn”和变量“ln”中保存的字符串的首字母(第一个字符)

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

int main(void)
{
string fn, ln, initials;

fn = get_string("\nFirst Name: ");
ln = get_string("Last Name: ");

initials = 'fn[0]', 'ln[0]';

printf("%s", initials)

}

最佳答案

阅读有关 C 的更多内容。特别是阅读一些优秀的 C 编程书籍,以及一些 C reference网站并阅读 C11标准n1570 。请注意,cs50.h 不是标准 C 头文件(我从未遇到过它)。

string 类型不存在。因此您的示例无法编译,并且不是有效的 C 代码。

C 中一个重要(且困难)的概念是:undefined behavior (UB)。我不会在这里解释它是什么,但请参阅 this ,阅读更多有关 UB 的内容,并且真正害怕 UB。

即使您(错误地)添加了类似的内容

typedef char* string;

(并且您的 cs50.h 可能会这样做)您需要了解:

  • 并非每个指针都是有效的,并且某些指针可能包含无效地址(例如NULL,或大多数随机地址;特别是未初始化的指针变量通常具有无效指针)。请注意,在您的 virtual address space 中大多数地址都是无效的。取消引用无效指针是 UB(通常但并非总是给出 segmentation fault )。

  • 即使指向 char 的指针有效,它也可能指向非字符串的内容(例如,某些不是 NUL 终止的字节序列)。将这样的指针(指向非字符串数据)传递给与字符串相关的函数 - 例如strlenprintf其中 %s 为 UB。

字符串是一个字节序列,具有附加约定:至少它应该以 NUL 结尾,并且您通常希望它是系统的有效字符串。例如,我的 Linux 使用 UTF-8 (2017 年 UTF-8 为 used everywhere )因此实际上只有有效的 UTF-8 字符串才能在我的终端中正确显示。

数组被衰减为指针(阅读更多内容以了解这意味着什么,这很棘手)。因此,在某些情况下,您可能会声明一个数组变量(缓冲区)

 char buf[50];

然后填写它,也许使用 strcpy喜欢

 strcpy(buf, "abc");

或使用snprintf喜欢

 int xx = something();
snprintf(buf, sizeof(buf), "x%d", xx);

后者可以用作“字符串”,例如

printf("buf is: %s\n", buf);

某些情况下(但并非总是如此!),您甚至可以进行一些数组访问,例如

char c=buf[4];
printf("c is %c\n", c);

或者像这样的指针算术

printf("buf+8 is %s\n", buf+8);

顺便说一句,由于 stdio 已缓冲,我建议以 \nfflush 结束 printf 控制格式字符串。 .

要小心并非常小心 buffer overflows 。这是 UB 的另一个常见原因。

您可能想要声明

 char initials[8];

并填充该内存区域以成为正确的字符串:

 initials[0] = fn[0];
initials[1] = ln[0];
initials[2] = (char)0;

最后一个赋值(对initials[2])是放置NUL终止字节并使该initials缓冲区成为正确的字符串。然后你可以使用 printffputs

输出它
fputs(initials, stdout);

你最好用

输出换行符
putchar('\n');

(或者你可能只是做 puts(initials); ....)

请使用所有警告和调试信息进行编译,因此 gcc -Wall -Wextra -gGCC 。改进您的代码以消除警告。了解如何use your compileryour debugger gdb。使用gdb逐步运行您的程序并查询其状态。花时间阅读 documentation您正在使用的每个标准函数(例如 strcpyprintfscanffgets),即使一开始也是如此你不明白这一切。

关于c - C语言中如何给字符串赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47483328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com