2015-10-10 37 views
0

尝试打印出字符串指针后,在字符数组的前动态插入字符时我有一些困难。字符串指针打印怪异符号

参数* str是从我的主动态字符数组,而输入为执行插入后应追加到动态数组的第一个元件的单个字符()。

int main(){ 
//code snippet. I removed other part to keep the question short 
printf("How many characters do you want to input: "); 
scanf("%d", &n); 
str = malloc(n + 1); 
printf("Input the string class: "); 
scanf("%s", str); 

//switch statement 
case '1': 
    printf("What is the character you want to insert: "); 
    scanf(" %c", &input); 
    insert(&str, input); 
    break; 
} 
return 0; 
} 

void insert(char *str, char input) { 
    char *new_str; 
    int i, len = strlen(str); 

    new_str = malloc(len + 1); 
    new_str[0] = input; 
    strncpy(&new_str[1], str, len - 1); 
    new_str[len] = 0; 

    for (i = 0; i < len; i++) { 
     printf("%c", new_str[i]); 
    } 
} 

当我试图通过new_str循环打印出字符串数组时,它给了我很奇怪的符号,我不知道它们是什么。有任何想法吗?

编辑

预期输出如下:

How many characters do you want to input: 5 
Input the string:datas 
The string is: datas 
Do you want to 1-insert or 2-remove or 3-quit?: 1 
What is the character you want to insert: a 
Resulting string: adata 

输出我得到:

enter image description here

+2

'的strlen()'不计终止空。 –

+0

那么我应该如何修改它?将for循环中的第二个条件更改为new_str [i]!='\ 0'? – hyperfkcb

+0

也许'malloc(len + 2)'? –

回答

1

我假设主叫方将free如果需要orig

char * insert(char *orig, char input) { 
    char * new_str = malloc(strlen(orig) + 2); // An extra one for null 
    strcpy(new_str + 1, orig); 
    new_str[0] = input; 
    printf("%s", new_str); // To print it out 
    return new_str; // The caller needs to free this; 
} 

这应该工作。

+0

不幸的是,它仍然打印出奇怪的符号 – hyperfkcb

+1

奇怪的是什么?什么是输入?什么是原创?问题出在链条上 –

+0

也许了解单元测试 –

1

组装所有评论:

void insert(char *str, char input) { 
    char *new_str; 
    int i, len = strlen(str); 

    new_str = malloc(len + 2); 
    new_str[0] = input; 
    strcpy(new_str+1, str); 
    new_str[len+1] = 0; 

    for (i = 0; i <= len; i++) { 
     printf("%c", new_str[i]); 
    } 
} 

当然,你仍然需要做一些新的字符串,比如返回,或释放它。

+0

不幸的是,这个奇怪的符号仍然打印出来。 – hyperfkcb

+0

然后奇怪的符号是'input'。拿一个调试器并检查它。我测试了它并且工作正常/ –

+0

但是,当我注释掉代码的其余部分并尝试从insert()打印输入时,它将打印从main()传递的用户输入。 – hyperfkcb

2

替代版本,避免任何字符串拷贝功能。 (因为,改变的strlen()你已经知道字符串的长度复制,你不需要任何更多的字符串函数)

char * insert_a_character(char * str, char ch) 
{ 
char * new; 
size_t len; 

if (!str) return NULL; 
len = strlen(str); 

new = malloc (1+len+1); 
if (!new) retun NULL; 

new[0] = ch; 
memcpy(new+1, str, len); 
new[len+1] = 0; 

return new; 
} 
+0

除了使用C++关键字'new'作为变量名,这是一个很好的答案 – user3629249

+1

这是故意的。 C和C++是不同的语言。混淆它们会导致更大的问题。 – wildplasser