Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中字符串复制中的分词_C - Fatal编程技术网

C语言中字符串复制中的分词

C语言中字符串复制中的分词,c,C,我在下面的循环中得到分段错误 int main() { register char *str = "Hello World"; char *ans; ans = test(str); if(!ans) return 1; free(ans); return 0; } char *test(char *str) { char *str1 ; char *str2; char *s

我在下面的
循环中得到
分段错误

int main() {
    register char *str = "Hello World";
    char *ans;
    ans = test(str);
    if(!ans)
        return 1;
    free(ans);
    return 0;
}
char *test(char *str) {

         char *str1 ;
         char *str2;
         char *str3;
         str1 = malloc(strlen(str) + 5);
         str2 = str;
         str3 = str1;
         *str3++ = '\b';
         *str3++ = '\b';
         while(*str2)
             *str3++ = *str2++;
         *str3++ = '\f';
         *str3++ = '\f';
         *str3 = '\0';
         return (str1);
}

我想我在
循环中遇到了
分段错误。你能告诉我为什么吗?我把它称为
char*ans=test(string)
其中
string
register char*string
。比如说,字符串中有
hello world
。我的意图是从
test()

返回
\b\bHello World\f\f
,您的问题是没有正确声明您的函数
test
。您必须在使用之前声明所使用的每个函数,无论是将实际函数放在上面还是编写函数声明

一旦这样做,您的代码就会工作:

#include <stdio.h>
char *test (char *str); // this is the function declaration
int main(void) {
    register char *str = "Hello World";
    char *ans;
    ans = test(str);
    if(!ans)
        return 1;
    free(ans);
    return 0;
}
char *test(char *str) {

         char *str1 ;
         char *str2;
         char *str3;
         str1 = malloc(strlen(str) + 5);
         str2 = str;
         str3 = str1;
         *str3++ = '\b';
         *str3++ = '\b';
         while(*str2)
             *str3++ = *str2++;
         *str3++ = '\f';
         *str3++ = '\f';
         *str3 = '\0';
         return (str1);
}
#包括
字符*测试(字符*str);//这是函数声明
内部主(空){
register char*str=“Hello World”;
char*ans;
ans=试验(str);
如果(!ans)
返回1;
免费(ans);
返回0;
}
字符*测试(字符*str){
char*str1;
char*str2;
char*str3;
str1=malloc(strlen(str)+5);
str2=str;
str3=str1;
*str3++='\b';
*str3++='\b';
而(*str2)
*str3++=*str2++;
*str3++='\f';
*str3++='\f';
*str3='\0';
返回(str1);
}

演示:

您如何调用它,它应该做什么,为什么不缩进?请发布一个。编写的代码可以与这样的程序配合使用:
intmain(void){char*t1=test(“Hello World”);if(t1!=0)printf([%s]\n],t1);free(t1);return 0;}
-假设您包含了强大的三个标题(
)-并为其提供了一份干净的健康清单。因此,要么您在修复代码的同时使其足够干净以进行编译,要么您的问题就在别处。当然是这样。问题是您在使用它之前没有声明
test
,因此编译器假设它在调用时返回
int
,但这在64位上不能正常工作(因为
sizeof(int)!=sizeof(char*)
在64位上,但它在32位上“工作”,因为存在
sizeof(int)==sizeof(字符*)
。但是编译器应该对你大喊大叫。你忽略了多少警告?你实际使用的是哪个版本的GCC,在哪个平台上。至少,添加
-std=c11-Wall-Wextra
;我会在列表中添加其他选项,然后再冒险在这里发布代码。请注意,在你C编程生涯的这个阶段,如果piler会生成一个警告,将其视为运行程序之前必须修复的错误。事实上,如果你有任何感觉,你会将其作为未来无限期的指导方针。我用C编写代码才30多年,如果有警告,我会确保我完全理解它的含义以及为什么要得到它,然后再忽略它。我会我花了相当长的时间来确保我的代码在严格的选项下编译时零警告,并使用
-Werror
(这迫使GCC将警告视为错误)。