【问题标题】:Copy strings with limited characters复制字符有限的字符串
【发布时间】:2015-03-11 18:15:36
【问题描述】:

好吧,这是一个家庭作业问题,我不能使用 string.h 库。此功能是复制不超过 n 个字符(字符 跟随空字符不复制)从s2指向的数组到s1指向的数组。

int main()
{
    char sourceString[100];
    char targetString[100];
    int num;
    printf("Enter a string:");
    gets(sourceString);
    printf("Enter no. of characters: ");
    scanf("%d", &num);
    printf("stringncpy(): %s", stringncpy(targetString, sourceString, num));
}

char *stringncpy(char * s1, char * s2, int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        if (s2[i] != '\0')
        {
            s1[i] = s2[i];
        }
        else
        {
            break;
        }
    }
    s1[i] = '\0';
    return s1;
}

它运行良好,只是它在 n 个字符之后打印了一些垃圾无法识别的字符。显然使用http://ideone.com/ 运行代码,我没有得到那些垃圾字符,但在 VS 上却有。

【问题讨论】:

  • 你的编译器应该警告你s1[i] == '\0'的结果没有被使用,因为它是一个比较。在此处使用分配=
  • @MOehm 是的,抱歉,错字。
  • 嗯,这也是解决您问题的方法,不是吗?因为垃圾字符来自非空终止字符串。
  • 顺便说一句,gets 是邪恶的……这解决了问题吗?
  • 哦,确实如此。不知何故,当我早些时候重新编译时,我遇到了同样的错误。我知道 gets() 的情况,在这里使用它是为了让事情变得简单。

标签: c string


【解决方案1】:

因为用了gets所以最好用

     if (s2[i] != '\0' && s2 [i] != '\n')

如果

      if (s2[i] != '\0')

如果n 定义了最大字符数,您应该确保n &lt; 100。在for 循环i == n 之后将'\0' 写入第i 个位置可能会导致问题。或者循环应该是

     for (i = 0; i < n-1; i++)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2012-08-22
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多