我试图找到一个单词的结尾,例如学校,并在一个单词的末尾加上它。
这是我到目前为止所做的:
for (int i = 0; i < 10; i++) {
plural[i] = orig[i];
if (plural[i] == NULL) {
plural[i] = 's';
plural[i + 1] = '\0';
}
}
答案 0 :(得分:2)
您的代码可能在orig
中的字符串函数长度少于10个字符,NULL
定义为0
。
但请注意,NULL
用于表示空指针,而不是字符串末尾的空字节。 NULL
可以这样定义:
#define NULL ((void*)0)
在这种情况下,您的代码会在编译时生成警告。
在字符串末尾为空字节写'\0'
被认为是好的风格。 null字符常量具有相同的值0
,类型为int
,但为了表示空字节更明确。
您应该测试orig[i]
是否为非空而不是迭代到10
:
char orig[] = "world";
char plural[10];
int i;
for (i = 0; orig[i] != '\0'; i++) {
plural[i] = orig[i];
}
plural[i] = 's';
plural[i + 1] = '\0';
答案 1 :(得分:1)
您可以通过以下方式确定空终止符('\0'
)的位置:
int len;
for(len = 0; cstr[len]; ++len);
这是strlen
的一个可能的最小实现,它代表确定char
数组的长度。例如:
#include <stdio.h>
int main() {
char cstr[10] = "Test";
size_t len;
for(len = 0; cstr[len]; ++len);
if(sizeof(cstr) > len + 1) {
cstr[len++] = 's';
cstr[len] = '\0';
}
printf("%s\n", cstr);
}
注意:正如David C. Rankin在评论中提到的那样,你必须保护数组边界。知道这是一个数组,您可以使用sizeof
运算符来读取它的大小。
答案 2 :(得分:1)
本练习最重要的部分是确保您学会保护阵列边界。如果声明一个char [10] 的数组,那么它可以容纳的最长的字符串是9-chars + the nul-byte
。如果您打算在结尾添加字符(例如's'
),则表示原始字符串不能超过8-chars
。
如果您将plural
声明为:
char plural[10] = ""; /* note the initialization to all `0` */
然后plural
为了使用plural
作为字符串而在sizeof plural - 1
中可以保留的最大字符数是max
字符(*保留空间 nul-byte )。因此,您可以使用以下内容为字符串的长度设置char plural[10] = ""; /* note the initialization to all `0` */
int max = sizeof plural - 1;
:
if (len >= max) { /* validate room for 's' available */
fprintf (stderr, "error: adding 's' will exceed array size.\n");
return 1;
}
然后,在找到原始字符串长度后,您可以验证 nul-byte 有足够的空间,例如
#include <stdio.h>
int main (int argc, char **argv) {
char plural[10] = "", *def = "school";
int len = 0,
max = sizeof plural - 1;
if (argc == 1) { /* if no argument given, copy def to plural */
char *p = def;
for (int i = 0; *p && i < max; i++, len++)
plural[i] = *p++;
}
else /* otherwise copy argv[1] to plural */
len = snprintf (plural, max, "%s", argv[1]);
if (len >= max) { /* validate room for 's' available */
fprintf (stderr, "error: adding 's' will exceed array size.\n");
return 1;
}
plural[len] = 's'; /* add 's' - (nul-terminated via initialization) */
printf ("original : %s\nappended : %s\n", argc > 1 ? argv[1] : def, plural);
return 0;
}
在一个简短的例子中将所有部分放在一起,你可以做类似以下的事情:
$ ./bin/plural
original : school
appended : schools
$ ./bin/plural 12345678
original : 12345678
appended : 12345678s
$ ./bin/plural 123456789
error: adding 's' will exceed array size.
示例使用/输出
if (argc == 1) /* if no argument given, copy def to plural */
for (int i = 0; def[i] && i < max; i++, len++)
plural[i] = def[i];
else /* otherwise copy argv[1] to plural */
len = snprintf (plural, max, "%s", argv[1]);
注意:如果您对数组索引比使用指针算法更熟悉,则可以使用以下等效语句进行长度查找并复制:
string.h
仔细看看。有很多种方法可以解决这个问题。正常添加将包括strlen
并使用strcpy
和memcpy
或plural
代替循环来查找您的长度或将字符复制到memcpy
(注意:对于长字符串{{1}}将更有效,但对于10个字符 - 它没有区别)如果您有任何问题,请告诉我。