检查c字符串数组的结尾

时间:2017-07-15 23:08:42

标签: c arrays c-strings

我试图找到一个单词的结尾,例如学校,并在一个单词的末尾加上它。

这是我到目前为止所做的:

for (int i = 0; i < 10; i++) {
    plural[i] = orig[i];

    if (plural[i] == NULL) {
        plural[i] = 's';
        plural[i + 1] = '\0';
    }
}

3 个答案:

答案 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并使用strcpymemcpyplural代替循环来查找您的长度或将字符复制到memcpy(注意:对于长字符串{{1}}将更有效,但对于10个字符 - 它没有区别)如果您有任何问题,请告诉我。