使用strncopy显示输出

时间:2014-04-23 14:04:26

标签: c string

我从C开始,我必须编写一个方法,返回由空格分隔的句子中的每个单词。

到目前为止,我有这个:

#include<stdio.h>
#include<string.h>

#define SIZE 100

int nextToken(char const * str, int* from, int* len);

int main(){
    char str[SIZE+1];
    char mot[SIZE+1];

    if(fgets(str, SIZE, stdin) == NULL){
        puts("Error");
        return -1;
    }
    str[SIZE] = '\0';

    int from = 0;
    int len = 0;

    while(nextToken(str, &from, &len)){
        strncpy(mot, &(str[from]), len);
        mot[SIZE] = '\0';
        printf("'%s'\n", mot);
        return 0;
    }
    return 0;
}

int nextToken(char const * str, int* from, int* len){
    *from = 1;
    *len = 2;
    return 1;
}

我知道while中的返回0,但它只是运行一次。

因此在nextToken函数中,当将len指向的值更改为1时,我得到输入问号的预期输出,即'e'

但是当将len指向的值更改为2时,我希望得到'el',但我得到'el¿■('

为什么我有这个输出,为什么它不打印'el'

对不起,如果这是愚蠢的,但我不知道为什么会这样,因为我开始。我在C89编译。

1 个答案:

答案 0 :(得分:2)

strncpy在复制len个字符时不会复制空终止符。在这种情况下,您需要确保字符串显式为空终止。

坦率地说,我不认为strncpy真的是你在这里使用的正确功能。

我这样写:

memcpy(mot, str+from, len);
mot[len] = '\0';

并且您想要检查这不会导致缓冲区溢出。