【问题标题】:How to change individual characters in string on C?如何在C上更改字符串中的单个字符?
【发布时间】:2019-03-16 06:20:08
【问题描述】:

尝试编写一些基本的刽子手代码来练习学习 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);
}

当我尝试运行它时,它只会在每次通过循环时打印 (null)。这可能是一个基本修复,但我是 C 新手,在网上找不到任何关于它的信息

【问题讨论】:

  • 试试printf("%c", gWord[a]);,因为gWord 数组中的项目是字符而不是字符串。此外,如果您想将整个 gWord 打印为字符串(即“%s”),则必须在其上附加一个 '\0' 字符。
  • 1) 使用%c 打印单个字符 2) 您需要在将gWord作为字符串打印之前以零结尾

标签: c arrays character


【解决方案1】:

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

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

到:

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

但在此之前也有变化:

gWord[a] = "_";

到:

gWord[a] = '_';

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

编辑:

也正如@4386427 所指出的,在稍后使用printf("%s", gWord) 打印之前,您永远不会零终止gWord。您应该将最后一行更改为:

printf("%s", gWord);

到:

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

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

【讨论】:

    【解决方案2】:

    这一行

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

    必须

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

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

    【讨论】:

    • length = strlen(word) - 1,所以原来的for循环是正确的。
    • 对,很抱歉混淆了。我会尽快修复它。
    【解决方案3】:

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

    既然你正在学习 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 格式说明符用于字符串,默认情况下会打印字符,直到遇到结束的空字符。因此,您应该确保在for 循环结束后在gWord 的末尾添加'\0'

    gWord[a] = '\0';
    

    除此之外,还有其他一些东西 -
    本声明:

    length = strlen(word) - 1;
    

    我看不出有任何理由从word 长度中减去1strlen 返回字符串的长度,不包括终止空字符本身。所以,strlen(word) 将给出输出5。现在您要从中减去 1 并运行循环直到 &lt;= length 可能会使代码的读者感到困惑。你应该这样做:

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

    另外,strlen() 的返回类型是size_tsize_t 是无符号类型。所以,你应该使用size_t类型的变量来接收strlen()的返回值。

    最后但同样重要的是,确保程序中没有任何未使用的变量/参数。您没有在程序中的任何地方使用argcargv。如果您使用gcc 编译器,则使用-Wall -Wextra 选项编译它。您会发现编译器会报告所有未使用的变量/参数。所以,如果不使用argcargv,那么你应该在main()函数的参数列表中简单地给出void

    把这些放在一起,你可以做到:

    #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;
    }
    

    【讨论】:

      【解决方案4】:

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

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

      1. gWord[a] = "_"; 观察这一行。您已在 " " 中指定 _。如果您不知道这一事实,则字符串的每个单独元素都是一个字符。并且每个字符都应该在 ' ' 中给出,即单引号而不是双引号。

      2. printf("%s", gWord[a]);又是一个类似的错误。 gWord[a] 是一个字符,而不是一个字符串。因此,您需要使用格式说明符 %c 而不是 %s 来打印它,而 %s 则用于字符串。

      3. 字符串,任何字符串都应该以NULL结尾,即\0(反斜杠ZERO)。这就是将字符数组与字符串区分开来的原因。因此,在将字符加载到gWord[] 后,只需添加以下行。

        gWord[a] = '\0';

      这里是完整的代码,只是做了 3 处改动:

      #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);
      }
      

      这是输出:

      _ _ _ _ _ .

      _____。

      【讨论】:

        【解决方案5】:
        #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*/
        }
        

        【讨论】:

          猜你喜欢
          • 2022-11-22
          • 1970-01-01
          • 1970-01-01
          • 2020-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多