【问题标题】:Getting the first 10 characters of a string?获取字符串的前 10 个字符?
【发布时间】:2013-04-27 05:50:19
【问题描述】:

我无法通过网络搜索找到任何信息。我应该去哪里看?

【问题讨论】:

标签: c string


【解决方案1】:
char myString[256]; // Input string
char dest[256];     // Destination string

strncpy(dest, myString, 10);
dest[10] = 0; // null terminate destination

【讨论】:

  • 快速提问,我可以做 strncpy(myString, myString,10) 吗?
  • 如果您想将字符串截断为 10 个字符,然后将 myString[10] = 0; (假设 myString 指向内存而不是字符串字母)
  • @user2341069 不,你不能,根据手册页“字符串可能不重叠,并且目标字符串 dest 必须足够大以接收副本。”由于 myString 是指向内存中 char 数组的指针,因此两次使用相同的指针意味着它们在内存中“重叠”,因此会导致错误。本质上,这意味着 src 不能是 dst 的子字符串,反之亦然。
  • 空终止字符是否不是 '\0' 而不仅仅是 0?
  • @TafT 他们是等价的
【解决方案2】:
char source[] = "abcdefthijklmn";
char target[100];

strncpy(target, source, 10);
target[10] = '\0'; // IMPORTANT!

【讨论】:

  • @michaelb958 那么我需要添加或更改什么?
  • 目标不是未初始化的指针。 target 指向堆栈中 100 字节的内存。 \0 不是必需的,因为 strncpy 会说它
  • @LefterisE 不确定初始化的事情,但strncpy 不会自动放置'\0'
  • @LefterisE 当我评论时,声明是char *target;
  • @michaelb958 是的。谢谢你。我对char *achar a[100] 有点困惑
【解决方案3】:

补充以上答案:

char* someString = "your string goes here";

int main() 
{
  int n = 10;
  printf("(%.*s)\n", n, someString);

  return 0;
}

【讨论】:

    【解决方案4】:

    有许多不同的方法可以实现您的目标:

    • 你可以使用snprintf(最安全):

      char source[] = "abcdefthijklmn";
      char target[100];
      
      snprintf(target, sizeof target, "%.10s", source);
      
    • 如果您知道目的地至少有 11 个元素,则可以使用 strncat

      char source[] = "abcdefthijklmn";
      char target[100];
      
      *target = '\0';
      strncat(target, source, 10);
      
    • 您可以使用strlenmemcpy(关于目的地大小的相同假设):

      char source[] = "abcdefthijklmn";
      char target[100];
      size_t len = strlen(source);
      
      if (len > 10)
          len = 10;
      memcpy(target, source, len);
      target[len] = '\0';
      
    • 您可以使用循环(关于目标大小的相同假设):

      char source[] = "abcdefthijklmn";
      char target[100];
      size_t i;
      for (i = 0; i < 10; i++) {
          target[i] = source[i];
      }
      target[i] = '\0';
      
    • You could but should not use strncpy()

    【讨论】:

      【解决方案5】:

      如果您正在寻找一个好的来源,这里有一个在线手册页示例,您可以使用: http://linux.die.net/man/3/strncpy

      重要提示:您也可以使用 memcpy 代替 strncpy,但它需要您添加自己的空终止字节。

      警告:如果 src 的前 n 个字节中没有空字节,则放在 dest 中的字符串不会以空值结尾。

      因此,memcpy 和 strncpy 在这里的工作方式几乎相同,而且 memcpy 更高效且不易出错。

      【讨论】:

        【解决方案6】:

        我让它像这样工作。

           # include <stdio.h>
           # include <string.h>
           //Strings. String lenght terminator.
           //KHO2016.no1. mingw (TDM-GCC-32) . c-ansi .
           int main ()
           {
           //declare
           char src_str[20],dst_str[10];
        
           //valuate
           printf ("Enter a sentance of 20 letters\n");
           gets (src_str);
           strcpy (dst_str,src_str);
        
           //calculate
           dst_str [10] ='\0'; // from the "www.stack overflow"
           printf ("%s",dst_str);
           printf ("\n");
        
           //terminate
           return 0;
           }
        

        【讨论】:

          【解决方案7】:

          您还可以使用sprintf.10 精度格式:

          #include <stdio.h>
          #include <string.h>
          
          int main(void)
          {   
              char source[] = "abcdefghijklmnopqrstuvwxyz";
              char dest[11];
              memset(dest, '\0', sizeof(dest));
          
              sprintf(dest, "%.10s", source);
          
              printf("%s", dest); // abcdefghij
              return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-05-17
            • 2013-04-03
            • 1970-01-01
            • 1970-01-01
            • 2010-12-28
            • 1970-01-01
            相关资源
            最近更新 更多