在C中执行子字符串

时间:2013-06-20 15:46:35

标签: c substring

我是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 *传递给函数。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

只做

string[i]=0;

这将在指定点之后放置一个字符串结尾字符,从而切断字符串的其余部分。

答案 1 :(得分:1)

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;
}