如何在C上的字符串中更改单个字符?

时间:2018-10-11 08:22:15

标签: c arrays character

试图编写一些基本的子手代码来练习学习C,但是我似乎无法更改程序中的单个字符

int main(int argc, char *argv[]) {
    int length, a, x;
    x = 0;
    char gWord[100];
    char word[100] = "horse";

    length = strlen(word) - 1;
    for(a = 0; a<= length; a = a + 1){
        gWord[a] = "_";
        printf("%s", gWord[a]);
    }
    printf("%s", gWord);
}

当我尝试运行此命令时,它每次循环时都会打印(空)。这可能是一个基本修复程序,但是我是C语言的新手,无法在线找到任何相关信息

5 个答案:

答案 0 :(得分:6)

要打印字符而不是更改字符串:

printf("%s", gWord[a]);

收件人:

printf("%c", gWord[a]);

但在此更改之前:

gWord[a] = "_";

收件人:

gWord[a] = '_';

最后一个问题是您正在将字符串文字分配给单个字符。

编辑:

正如@ 4386427所指出的那样,在以后使用gWord打印printf("%s", gWord)之前,您永远不要将printf("%s", gWord); 终止于零。您应将最后一行从以下位置更改:

gWord[a] = '\0';
printf("%s", gWord);

收件人:

xml

因为否则很可能导致缓冲区溢出。

答案 1 :(得分:2)

此行

printf("%s", gWord[a]);

必须

printf("%c", gWord[a]);

要打印字符, c 是正确的说明符。 s 仅适用于整个字符串,并采用char指针。

答案 2 :(得分:1)

编译代码时是否收到任何警告消息?

由于您正在学习C语言,因此有一个建议-不要忽略编译器给出的任何警告消息,它们出于某种原因而存在。

代码中的三个问题:

第一
为字符分配字符串:

gWord[a] = "_";

gWord100个字符的数组,而gWord[a]a数组中位置gWord的字符。相反,您应该

gWord[a] = '_';

第二:
使用错误的格式说明符来打印字符:

printf("%s", gWord[a]);
        ^^

要打印字符,应使用%c格式说明符:

printf("%c", gWord[a]);

第三:
错过了在gWord末尾添加空终止符并打印的问题:

printf("%s", gWord);

在C语言中,字符串实际上是一维字符数组,以空字符'\ 0'终止。 %s格式说明符用于字符串,默认情况下会打印字符,直到遇到结尾的空字符为止。因此,您应该确保在'\0'循环完成后,在gWord的末尾添加for

gWord[a] = '\0';

除了这些之外,还有其他几件事-
这句话:

length = strlen(word) - 1;

我没有发现从1长度中减去word的任何原因。 strlen返回字符串的长度,但不包括结尾的空字符本身。因此,strlen(word)将给出输出5。现在,您将从此循环中减去1并运行循环,直到<= length可能会使代码阅读者感到困惑。您应该简单地做:

    length = strlen(word);
    for(a = 0; a < length; a = a + 1){
     ....
     ....

此外,返回类型strlen()size_t,而size_t是无符号类型。因此,您应该使用类型size_t的变量来接收strlen()的返回值。

最后但并非最不重要的一点是,请确保程序中没有任何未使用的变量/参数。您不在程序中的任何地方使用argcargv。如果您使用的是gcc编译器,请使用-Wall -Wextra选项对其进行编译。您会发现编译器将报告所有未使用的变量/参数。因此,如果不使用argcargv,则只需在void函数的参数列表中输入main()

将所有内容放在一起,您可以执行以下操作:

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

int main(void) {
    size_t length, a;
    char gWord[100];
    char word[100] = "horse";

    length = strlen(word);
    for(a = 0; a < length; a = a + 1) {
        gWord[a] = '_';
        printf("%c", gWord[a]);
    }

    gWord[a] = '\0';
    printf ("\n");
    printf("%s\n", gWord);
    return 0;
}

答案 3 :(得分:0)

从语法上讲,您的代码没问题@Blookey。但逻辑上,实际上没有。

让我指出导致代码中不良行为的3个地方:

  1. gWord[a] = "_";遵守这一行。您已在“” 中指定了_。如果您不知道这一事实,则字符串的每个单独元素都是一个字符。并且每个字符应该以''给出,即单引号而不是双引号。
  2. printf("%s", gWord[a]);再次出现类似错误。 gWord[a]是一个字符,而不是字符串。因此,您需要使用格式说明符%c而不是用于字符串的%s来打印它。
  3. 一个字符串,任何字符串都应以NULL结尾,即 \0 (反斜杠零)。这就是区别字符数组和字符串的原因。因此,一旦将字符加载到gWord[]中,就只需添加以下行。

    gWord[a] = '\0';

这是完整的代码,仅作以下三个更改:

#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[]) {
    int length, a, x;
    x = 0;
    char gWord[100];
    char word[100] = "horse";

    length = strlen(word) - 1;
    for(a = 0; a<= length; a = a + 1){
        gWord[a] = '_';
        printf("%c ", gWord[a]);
    }
    gWord[a] = '\0';
    printf("\n%s", gWord);
}

这是输出:

  

_ _ _ _ _。

     

_____。

答案 4 :(得分:0)

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

int main(int argc, char *argv[]) {
int length, a, x;
x = 0;
char gWord[100] = {0};
char word[100] = "horse"; /*note that if the array in place strlen +1 is not nulled  before using strlen you might not get the correct result*/

length = strlen(word) - 1;/*strln will return 5, that is the letters inn the string the pointer is pointing to until the first terminator '\0'*/
for(a = 0; a<= length; a = a + 1){
gWord[a] = '_'; /* if you use "_" it will try to fit in the chars '_' and '\0' to each char slot of the array*/
printf("%c", gWord[a]); /* %s looks for a string to print while here there are single chars to print*/
}
printf("\n");/*you can print the hole string like this */
printf("%s", gWord); 

return 0;/*and remember that main function should always have a return value*/
}