我从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编译。
答案 0 :(得分:2)
strncpy
在复制len
个字符时不会复制空终止符。在这种情况下,您需要确保字符串显式为空终止。
坦率地说,我不认为strncpy
真的是你在这里使用的正确功能。
我这样写:
memcpy(mot, str+from, len);
mot[len] = '\0';
并且您想要检查这不会导致缓冲区溢出。