C中的字符串指针打印出奇怪的符号

时间:2015-10-10 11:43:59

标签: c string pointers ascii

在char数组前面动态插入一个字符后尝试打印字符串指针时遇到了一些困难。

参数* str是来自main的动态char数组,而输入是一个单字符,在执行insert()后应附加到动态数组的第一个元素。

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

3 个答案:

答案 0 :(得分:3)

替代版本,避免任何字符串复制功能。 (因为,改变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;
}

答案 1 :(得分: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;
}

这应该有效。

答案 2 :(得分: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]);
    }
}

当然,您仍然需要对新字符串执行某些操作,例如返回或释放它。