我是C的新手,目前正在尝试获取字符串的子字符串。最终的目标是我有一个字符串,它包含一组数字,即6218,我继续取一个子字符串,以便删除最后一个数字,即:

6218
621
62
6

目前我正在硬编码我想要的长度,所以作为一个开始,我正在做一个4的子串,期望结果仍然是6218。然而,当我在gdb中打印时,它在62岁就出来了。
下面是我正在使用的代码。
char * performSearch(char * phoneNumber, int totalLookupNumberCount, numberLookupStruct *numberLookup, int maxCharsToLookup)
{
     int i;
    for (i = strlen(phoneNumber); i < maxCharsToLookup; i--)
    {
        char searchNumber[i+1];
        strncpy(searchNumber, phoneNumber, 4);
        searchNumber[i+1] = '\0';
    }
}

函数由以下调用:
char * displayName = performSearch(phoneNumber, totalLookupNumberCount, numberLookup, maxCharsToLookup);

我正在逐步通过GDB中的代码,所以我做的第一件事,是在strncpy之后打印searchNumber,因此循环实际上没有被使用。
我已经检查了通过的变量和strlen返回的内容及其正确性
所以在上面的代码中,我希望searchNumber仍然是6218,但是它输出的是62。另外要注意的是,phoneNumber作为char*传递给函数。
谢谢你的帮助。

最佳答案

for测试条件似乎错误:

for (i = strlen(phoneNumber); i < maxCharsToLookup; i--)

如果maxCharsToLookup大于strlen(phoneNumber),那么当i变为负值时,这个循环似乎会做一些有趣的事情。如果maxCharsToLookup小于或等于strlen(phoneNumber),则循环永远不会启动。也许你需要这样的东西:
for (count = 0, i = strlen(phoneNumber);
     count < maxCharsToLookup && i > 0;
     ++count, --i)

strncpy()很难使用。如果源字符串的字符串长度短于指定的复制长度,则它只会NUL终止目标字符串。这是一条很难记住的规则。此外,它将始终写入您在最后一个参数中指定要写入的字节数。在你的代码中:
    char searchNumber[i+1];
    strncpy(searchNumber, phoneNumber, 4);
    searchNumber[i+1] = '\0';

如果i小于3,strncpy()将溢出缓冲区。这将导致未定义的行为。然后将缓冲区后面的字节设置为NUL,这也是未定义的。你应该这样做:
    char searchNumber[i+1];
    strncpy(searchNumber, phoneNumber, i);
    searchNumber[i] = '\0';

我更喜欢使用snprintf()。它总是NUL终止结果字符串。
#include <stdio.h>
#include <string.h>
int main () {
    char phoneNumber[] = "6218";
    for (int i = strlen(phoneNumber); i > 0; --i) {
        char searchNumber[i+1];
        snprintf(searchNumber, sizeof(searchNumber), "%s", phoneNumber);
        puts(searchNumber);
    }
    return 0;
}

关于c - 在C中执行子串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17218112/

10-12 15:04