使用char **指针的字符串操作代码会产生意外结果

时间:2015-06-13 07:25:12

标签: c string pointers char-pointer

我试图为我需要给定字符串的子字符串实现一个字符串解析代码,所以我做了以下事情:

头文件是:test.h

#ifndef header_file
#define header_file

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

int increment(char **);

#endif  

源文件:main.c test.c

test.c:

  1. 案例1:test.c

    #include“test.h”

    int increment(char ** string){

        char *temp = *(string);
        int value;
    
    
        if(temp != NULL){
    
                *(string) = ++temp;
                value = 1;
        }
    
        else{
                value = 0;
        }
    
        return value;
    

    }

  2. 案例2:test.c

    的#include “test.h”

    int increment(char ** string){

        char *temp = *(string);
        int value;
    
    
        if(*temp != '\0'){
    
                *(string) = ++temp;
                value = 1;
        }
    
        else{
                value = 0;
        }
    
        return value;
    

    }

  3. main.c中:

    #include"test.h"
    
    int main()
    {
            char str[30] = "I have done form here comes.";
            char strs[50];
    
            char *p = str;
    
            memset(strs, 0, 50);
    
            while(increment(&p))
            {
                    strcpy(strs,p);
                    printf("Originally the string is : %s\n", str);
                    printf("The modified string is   : %s\n", strs);
                    memset(strs, 0, 50);
            }
    
            return 0;
    }
    

    makefile是:

    #This is the makefile.
    
    all : run main.o test.o
    
    run : main.o test.o
            $(CC) -g $^ -o $@
    
    %.o : %.c
            $(CC) -g -c $^ -o $@
    
    .PHONY : clean
    
    clean : 
            -rm -f *.o run
    

    但是在test.c中的第一种情况下,我试图遍历子字符串,但它给出了一些垃圾结果。 第二种情况正常。

    test.c案例1出了什么问题。

    感谢!!!!!!!!!!!!

1 个答案:

答案 0 :(得分:2)

  

目的是为字符串中的每个单词添加前缀和后缀,因此我需要在单词,单词和单词之后的字符串。 ex:prefix_I_suffix已经完成了表格。我在前面写了prefix_have_suffix表格。

你做错了一些事。

  1. 我根本没有看到任何地方的空格分割,这似乎是你的主要要求。
  2. 然而,我看到一些针对指针的疯狂操作。坦率地说,我无法理解它们背后的逻辑。
  3. 因此,让我举例说明如何完成它 - 不需要修改任何指针:

    #include <stdio.h>
    #include <string.h>
    
    int main ()
    {
        char str[] = "I have done answer here comes.";
    
        const char *delimiters = " ";
        char *pch = strtok(str, delimiters);
        while (pch != NULL)
        {
            printf("prefix_%s_suffix\n", pch);
            pch = strtok(NULL, delimiters);
        }
        return 0;
    }
    

    将输入复制到中间数组,您可以根据需要进行修改:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main ()
    {
        char str[] = "I have done answer here comes.";
    
        char **array = NULL;
        size_t array_size = 0;
    
        const char *delimiters = " ";
        char *pch = strtok(str, delimiters);
        while (pch != NULL)
        {
            size_t str_size = strlen(pch) + 1; //to accommodate for `\0` byte
            char *str_copy = malloc(str_size);
            if (!str_copy)
            {
                printf("No memory!");
                return 1;
            }
            memcpy(str_copy, pch, str_size);
    
            ++ array_size;
            array = realloc(array, sizeof(char*) * array_size);
            if (!array)
            {
                printf("No memory!");
                return 1;
            }
            array[array_size - 1] = str_copy;
    
            pch = strtok(NULL, delimiters);
        }
    
        for (size_t i = 0; i < array_size; i ++)
        {
            printf("prefix_%s_suffix\n", array[i]);
            free(array[i]);
        }
        free(array);
    
        return 0;
    }