我目前正在从事一个计算机科学项目并且已经完全开始工作了一个非常具体的案例,我似乎无法修复。代码的目标是编写一个函数int tokenCopy(char * dest,const char * src,int destSize),它将给定源字符串src中的字符复制到给定的目标缓冲区dest(大小为destSize),直到:
发生源字符串的结尾,或 目标缓冲区已满(允许使用所需的终结符),或者在输入字符串中找到空格字符
以先到者为准。如果由于找到空格而完成复制,则不会复制空间。必须始终正确终止目标字符串。如果源字符串的目标空间不足,则目标字符串必须是源字符串的正确终止的前导子字符串。
返回值是复制的字符数,不包括终止空字节。
以下列形式进行测试:
char buff[3];
int n = tokenCopy(buff, "This is a string", 3);
printf("%d '%s'\n", n, buff);
到目前为止,这是我的代码:
#include <stdio.h>
int tokenCopy(char* dest, const char* src, int destSize){
int new_value = 0;
int i=0;
for (;*src != ' '; new_value++){
destSize = 1;
return new_value;
}
for (; *src != '\0' && *src!= ' '; new_value++)
{
while (i < destSize-1 && *src!= '\0'){
*dest = *src;
dest++;
src++;
new_value++;
i++;
*dest = '\0';
}
return new_value;
}
return new_value;
}
但是在以下测试的情况下:
char buff[10];
int n = tokenCopy(buff, " ", 10);
printf("%d '%s'\n", n, buff);
输出应为:
0 ''
然而,我的代码输出的是零,然后是我尝试对代码进行的每次更改后,包含不同字母的语音标记后跟一个菱形中的问号。作为参考,我使用linux和Geany IDE。
非常感谢任何有关此问题的帮助。
答案 0 :(得分:3)
您需要在函数
中指定do
dest
答案 1 :(得分:0)
在摆脱第一个for
循环后,您可以将第二个for
循环修改为类似
for ( i = 0; *src != '\0' && *src!= ' ' && (i < destSize-1) ; i++)
{
*dest++ = *src++;
}
*dest = '\0';
return new_value;
得到你想要的东西。修改包括
答案 2 :(得分:0)
即使是函数实现的第一个循环
for (;*src != ' '; new_value++){
destSize = 1;
return new_value;
}
没有意义。
该功能可以按以下方式编写
#include <stdio.h>
size_t tokenCopy( char *dest, const char *src, size_t destSize )
{
size_t n = 0;
if ( destSize != 0 )
{
while ( n < destSize && *src && *src != ' ' ) dest[n++] = *src++;
dest[n == destSize ? --n : n] = '\0';
}
return n;
}
int main( void )
{
char buff[10];
size_t n;
n = tokenCopy( buff, " ", 10 );
printf("%zu \"%s\"\n", n, buff );
n = tokenCopy( buff, "0123456789", 10 );
printf("%zu \"%s\"\n", n, buff );
}
程序输出
0 ""
9 "012345678"
答案 3 :(得分:0)
#include<stdio.h>
int tokenCopy(char* dest, const char* src, int destSize){
while(*src && destSize>1 && *src!=' ') {
*dest = *src;
dest++;
src++;
destSize--;
}
*dest = '\0';
}
main(int argc, char **argv)
{
char buff[6];
tokenCopy(buff,"Th",6);
printf("%s\n",buff);
}