我是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/