4
char copy, array[20]

    printf("enter ..."):
    scanf("%s", array);

    if (strlen(array) > 20 ) 
      { 
       strcpy(copy, array....); 

如果输入的长度超过 20 个字符,我需要做什么才能让它只抓取前 20 个字符

4

7 回答 7

5
char array[20+1];
scanf("%20s", array);

问题解决了。

于 2011-02-25T21:35:39.200 回答
3

您的问题不清楚,因为代码几乎没有意义。您的输入不能超过 20 个字符,因为接收数组只有 20 个字符。如果用户输入更多,您的程序将产生未定义的行为。所以,这里的主要问题不是限制复制,而是限制输入。

但是,您的问题似乎是关于有限长度的字符串复制。如果这就是您所需要的,那么不幸的是,标准库中没有为此目的的专用函数。许多实现提供了非标准的strlcpy功能来做到这一点。因此,请检查您的实现是否提供strlcpystrlcpy自己实现。

在许多情况下,您可能会看到strncpy在这种情况下使用的建议。虽然有可能strncpy为此目的而工作,但实际上strncpy并不打算以这种方式使用。用作strncpy有限长度的字符串复制函数总是错误的。躲开它。

于 2011-02-25T21:35:21.557 回答
1

使用strncpy而不是strcpy. 这里的所有都是它的。(注意:如果目标字符串达到其限制,则不会strncpy终止目标字符串。)

编辑: 我没有仔细阅读您的程序。scanf如果用户输入超过 20 个字符,您已经输掉了通话。你应该打电话fgets。(我个人认为 *scanf 永远不应该使用 - 这只是冰山一角,就它们引起的问题而言。)此外,copy它只能容纳一个字符,而不是二十个字符;但我会假设这是你的错字。

于 2011-02-25T21:32:32.213 回答
1

或者,您不需要使用 strcpy 来读取 20 个字符(并且您不必包含 strings.h):

char c;
for( i = 0; i < 20; i++ ) {
    c = getchar();
    if (c != '\n') array[i] = c;
    else break;
}
array[i+1] = '\0';

不要忘记声明数组char array[21]以确保包含 '\0'。

于 2011-02-25T21:38:29.783 回答
0

使用strncpy。确保为空终止目的地。

于 2011-02-25T21:32:43.913 回答
0
 strncpy (copy, array, 20);

成功了。除了大于 20 个字符的字符串不会以空字符结尾!

http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

于 2011-02-25T21:33:12.107 回答
0

您需要更改您的 scanf() 调用,而不是您的 strcpy() 调用:

char copy[20], array[20];
printf("enter....");
scanf(%20s",array); // read a maximum of 20 characters
strcpy(copy, array);
于 2011-02-25T21:38:34.117 回答