【问题标题】:rearranging a char array with strncpy in C在 C 中使用 strncpy 重新排列 char 数组
【发布时间】:2021-05-29 08:14:27
【问题描述】:

我正在尝试更改arr 列表的排序,该列表可能包含zero, one, two 作为arr 的输入和存储值。 stringreplace 函数旨在将每个元素移动一个,因此新的排序将是 one, two, zero。我正在尝试使用strncpy 函数将元素相互替换,但我认为它有点错误,我该如何解决这个问题?

strncpy 函数

char stringreplace( char a[], int b){
    for(int j = 0; j > b -1; j++){
        strncpy(a[j], a[j+1], sizeof(a));}
    for(int j = 0; j > b; j++){
        printf("%s",a[j]);}
}

主要功能

int main()
{
    char input[100];
    char arr[100]= {0};
    int number;
    printf("Input the number of strings: ");
    scanf("%d", &number);
    for(int i= 0; i < number; i++){
        printf("Input the number of strings: ");
        scanf("%s", input);
        arr[i] = input;
    }
    stringreplace(arr, number);
    return 0;
}    

【问题讨论】:

  • sizeof(a) 是指针的大小,而不是字符串的长度。
  • strncpy() 的前两个参数必须是指针。 a[j]a[j+1] 不是指针,它们是字符。
  • 请在您的代码中打开警告。它们将帮助您处理错误的参数、将字符分配给指针以及缺少返回语句。
  • strncpy() 几乎是从不正确使用的函数。如果要复制字符串,请使用strcpy()。如果目的地不够大,无法容纳字符串,则需要修复它。
  • man strncpy “字符串不能重叠” a重叠a

标签: c function for-loop if-statement conditional-statements


【解决方案1】:

您可以考虑动态分配字符串,将每个字符串的指针分配到数组words,然后将数组中的每个指针向左旋转。

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

void lrot_words(char *words[], int n);

int main(void)
{
    char *p, word[100], *words[100];
    int i, num_words;

    printf("Enter the number of words: ");
    scanf("%d", &num_words);

    for(i =  0; i < num_words; i++){
        printf("Enter a word: ");
        scanf("%s", word);

        if ((p = malloc(strlen(word) + 1)) == NULL) {
            fprintf(stderr, "Error: malloc failed\n");
            exit(EXIT_FAILURE);
        }

        words[i] = strcpy(p, word);
    }

    lrot_words(words, num_words);

    for (i = 0; i < num_words; i++) {
        printf("%s\n", words[i]);
    }

    return 0;
}   

void lrot_words(char *words[], int n)
{
    char *temp = words[0];
    int i;

    for (i = 0; i < n - 1; i++) {
        words[i] = words[i+1];
    }

    words[i] = temp;
}

【讨论】:

  • 请问什么是 malloc 部分?
  • 它返回一个指向动态分配的字符串的指针(对于单词中的字符和空字符来说足够长。如果无法分配存储单词所需的空间,则会打印错误消息程序终止。
  • 抱歉打扰了,但我也不明白char *temp = words[0]的原因@到底是干什么用的?
  • 由于words 中的每个元素都向左移动一次,第一个指针将被覆盖。这意味着我们需要将指针存储在一个临时变量中,稍后可以在所有元素移动后将其附加到数组的末尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
相关资源
最近更新 更多