c - 在 C 中执行子字符串

标签 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 * 传递给函数。

感谢您提供的任何帮助。

最佳答案

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/

相关文章:

python - 在 Python 中使用函数返回子字符串

基于版本参数转换函数参数以避免重复代码

c - 获取C中字符串常量的地址

c - 在集群的单个节点上运行 OpenMP

c# - 编写正则表达式以搜索子字符串 C#

Java从列表中查找部分匹配的字符串

c - 再次浮点精度

Java 与 C 运行时(REPOST)

python - 当一列包含特定子字符串时,在多列上剪切子字符串

python - python中的子串