【问题标题】:Get a string and extract 2 substring in c获取一个字符串并在c中提取2个子字符串
【发布时间】:2018-03-24 17:30:41
【问题描述】:

我只想从输入中读取“c4 d5”形式的字符串并保存两个子字符串:

str1 = "c4"

str2 = "d5"

我试过了:

char action[5];
char str1[2];
char str2[2];
scanf("%s", action);
strncpy(str1, &action[0], 2);
strncpy(str2, &action[3], 2);

但它给了我奇怪的行为......

在我学习 c 的同时,我正在寻找仅使用 char * 和仅使用 char[](在输入和输出中)的两种解决方案。

【问题讨论】:

  • 在你知道它的作用之前不要使用 strncpy()。
  • 请始终添加你得到的输出。
  • scanf 将在空格字符处停止读取。所以action 包含“c4”。
  • 输出有点奇怪,它取决于我的代码中的其他因素,第一次是这样的:输入:ciaoo 输出:ci ooci
  • strncpy不会在您的字符串中添加终止 0。而且您的目标字符串也不能包含多个字符(一个位置用于上述终止 0)。加起来不太好。

标签: c string substring


【解决方案1】:

当您过期奇怪的行为时,请务必阅读您正在使用的函数的手册页。 C 字符串几乎没有例外都应该以 \0 结尾,否则 printf/puts 可能不仅会打印您想要的内容,还会打印一些随机内存片段。此外,索引从 0 开始,因此为了获得第三个字符,您需要使用 [2]。

#include <stdio.h>

int main()
{
    char action[5];
    char str1[3];
    char str2[3];

    scanf("%s", action);

    strncpy(str1, action, 2);
    strncpy(str2, &action[2], 2);

    str1[2] = '\0';
    str2[2] = '\0';

    puts(str1);
    puts(str2);

    return 0;
}

Try it out

man page of strncpy

strncpy() 函数类似,只是最多复制 n 个字节的 src。警告:如果 src 的前 n 个字节中没有 null 字节,则放在 dest 中的字符串不会以 null 结尾。

【讨论】:

  • 我的“”字符还是有问题,是不是跟scanf有关?
  • 你到底是什么意思?
  • 尝试使用字符串“d4 e3”进行测试,只会保存d4
  • 我建议你看看这个问题:stackoverflow.com/questions/1247989/…
【解决方案2】:

这是一个子字符串函数。不要忘记在需要时释放结果。

/**
 * Substrings in a new string, handles \0
 * @param char* str , the string to substring
 * @param int from , the start index included
 * @param int count , the amount of characters kept
 */
char * strsubstr(char * str , int from, int count) {
    char * result;

    if(str == NULL) return NULL;

    result = malloc((count+1) * sizeof(char));

    if(result == NULL) return NULL;

    strncpy(result, str+from, count);
    result[count] = '\0';
    return result;
}

【讨论】:

    【解决方案3】:

    首先你必须了解c的一些基本原理。
    如果 Scanf 读取了空格 <br>,则 Scanf 将停止其 %s“字符串阅读器” 其次,您可以一次读取两个字符串。 “%s %s”
    在这种情况下,您不需要操作变量:

    #include <stdio.h>
    #include <string.h>
    int main(int argc, char const *argv[])
    {
        char str1[2];
        char str2[2];
        scanf("%s %s",str1,str2);
        return 0;
    }
    

    这样你就可以掩盖空间终止和指针游戏..

    【讨论】:

    • 谢谢,这是一个很酷的解决方案,但我仍然需要保存字符串以用于其他目的
    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多