【问题标题】:Performing a substring in C在 C 中执行子字符串
【发布时间】:2013-06-20 15:46:35
【问题描述】:

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

感谢您提供的任何帮助。

【问题讨论】:

  • 要使用 0 终止字符数组:searchNumber[i] = '\0'; C 中的数组使用从 0 开始的索引。
  • 请帮自己一个忙,打开编译器的警告(-Wall -Werror for GCC 在刚开始时很好)。
  • @Mat 如果您指的是 &searchNumber 我将其作为测试,我现在实际上已将其删除并且没有编译器警告(有 & 所以警告开启)但我我得到相同的结果
  • 什么是phoneNumber?是"6218"吗?
  • @jxh 是的电话号码是 6218

标签: c substring


【解决方案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;
}

【讨论】:

  • 谢谢,但结果相同,搜索编号设置为 62 而不是 6218
  • for 循环中添加一个打印语句以检查phoneNumbersearchNumber 是否是您在每次迭代中所期望的。与我提供的示例程序进行比较,它给了我预期的输出。 ideone.com/eDw6q1 如果没有明确使用 searchNumber 的代码,编译器可能会对其进行优化以执行其他操作,而您的调试器可能会看到这一点。
  • 是的,它正在工作,我正在通过 GDB 查看它并单步执行代码并打印它。但由于某种原因,在 GDB 类型中 print searchNumber 将打印 $i = "62"
  • 感谢您的帮助,非常感谢
【解决方案2】:

就这样

string[i]=0;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-17
    • 2016-08-06
    • 1970-01-01
    • 2014-08-12
    • 2013-02-19
    • 2021-01-22
    • 2013-06-01
    • 2021-10-19
    相关资源
    最近更新 更多