Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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
Objective c 我的C字符串反转函数的语法行为_Objective C_C_C Strings - Fatal编程技术网

Objective c 我的C字符串反转函数的语法行为

Objective c 我的C字符串反转函数的语法行为,objective-c,c,c-strings,Objective C,C,C Strings,我只是个业余程序员。。。 在两年多前的第二次阅读kochan的“Objective-C编程”时,现在是第六版,达到了指针章节,我试图恢复我开始使用C编程的旧时光。。。 所以,我试着编写一个反向C字符串函数,使用字符指针。。。 最后我得到了想要的结果,但是。。。还有一个非常奇怪的行为,我无法用我的编程经验来解释 首先是守则: 这是一个.m文件 #import <Foundation/Foundation.h> #import "*pathToFolder*/NSPrint.m" in

我只是个业余程序员。。。 在两年多前的第二次阅读kochan的“Objective-C编程”时,现在是第六版,达到了指针章节,我试图恢复我开始使用C编程的旧时光。。。 所以,我试着编写一个反向C字符串函数,使用字符指针。。。 最后我得到了想要的结果,但是。。。还有一个非常奇怪的行为,我无法用我的编程经验来解释

首先是守则:

这是一个.m文件

#import <Foundation/Foundation.h>
#import "*pathToFolder*/NSPrint.m"

int main(int argc, char const *argv[])
{
    @autoreleasepool
    {
        char * reverseString(char * str);
        char *ch;

        if (argc < 2)
        {
            NSPrint(@"No word typed in the command line!");
            return 1;
        }

        NSPrint(@"Reversing arguments:");

        for (int i = 1; argv[i]; i++)
        {
            ch = reverseString(argv[i]);
            printf("%s\n", ch);
            //NSPrint(@"%s - %s", argv[i], ch);
        }
    }

    return 0;
}

char * reverseString(char * str)
{
    int size = 0;

    for ( ; *(str + size) != '\0'; size++) ;

    //printf("Size: %i\n", size);

    char result[size + 1];
    int i = 0;

    for (size-- ; size >= 0; size--, i++)
    {
        result[i] = *(str + size);
        //printf("%c, %c\n", result[i], *(str + size));
    }

    result[i] = '\0';

    //printf("result location: %lu\n", result);
    //printf("%s\n", result);

    return result;
}
#导入
#导入“*pathToFolder*/NSPrint.m”
int main(int argc,char const*argv[]
{
@自动释放池
{
char*reverseString(char*str);
char*ch;
如果(argc<2)
{
NSPrint(@“命令行中没有键入单词!”);
返回1;
}
NSPrint(@“反转参数:”);
for(int i=1;argv[i];i++)
{
ch=反向限制(argv[i]);
printf(“%s\n”,ch);
//NSPrint(@“%s-%s”,argv[i],ch);
}
}
返回0;
}
char*reverseString(char*str)
{
int size=0;
对于(;*(str+size)!='\0';size++);
//printf(“大小:%i\n”,大小);
字符结果[大小+1];
int i=0;
对于(大小--;大小>=0;大小--,i++)
{
结果[i]=*(str+大小);
//printf(“%c,%c\n”,结果[i],*(str+size));
}
结果[i]='\0';
//printf(“结果位置:%lu\n”,结果);
//printf(“%s\n”,结果);
返回结果;
}
第二,请注意:

这段代码是在MacBook Pro中编译的,使用MacOS X Maverick,使用CLANG(CLANG-fobjc arc$file\u name-o$file\u name\u base)

NSPrint只是printf的一个包装器,用于打印由stringWithFormat:arguments:

第三,奇怪的行为:

如果我取消对所有已注释的printf声明的注释,则一切正常,即所有printf函数都会打印它们必须打印的内容,包括main函数中的最后一个printf

如果我取消注释那些注释printf函数中的一个,并且只是随机选择的一个,那么一切都正常工作,我得到了正确的printf结果,包括main函数中的最后一个printf

如果我保留所有已注释的printf函数的原样,我只得到main块中最后一个printf的空行,并且传递的每个参数都有一条黑行

最糟糕的是,如果我在main中使用NSPrint函数,而不是printf函数,我会得到想要的结果:


有人能给我们介绍一下吗:)

您返回的是一个本地数组,该数组在函数退出时超出了范围。取消对该内存的引用会导致未定义的行为。

您返回的是一个本地数组,该数组在函数退出时超出范围。取消对该内存的引用会导致未定义的行为。

您正在返回一个指向所调用函数的局部变量的指针。当该函数返回时,局部变量的内存变为无效,返回的指针是垃圾

您正在返回指向所调用函数的局部变量的指针。当该函数返回时,局部变量的内存变为无效,返回的指针是垃圾

@Sérgio Paulo你唯一的问题“有人能给这里带来一些光吗?”在这里得到了很好的回答。如果你想问更多的问题,请将其添加到你的帖子中或形成一个新的帖子。@Sérgio Paulo你唯一的问题“有人能给这里带来一些光吗?”在这里得到了很好的回答。如果你想问更多的问题,可以将其添加到你的帖子中,或者形成一个新帖子。