【问题标题】:Question mark at end of printfprintf 末尾的问号
【发布时间】:2017-02-09 06:32:49
【问题描述】:

这是一个在 C 中反转字符串的简单代码,最后一个 printf 语句打印相反的顺序,但最后有一个问号,而我只想打印反转的字符串而不是问号 我该如何解决?

#include<stdio.h>
#include<string.h>
int main(){
char new_string[100];
char string[100];
scanf("%s",string);
printf("original_number = %s\n",string);
int i;
int l = strlen(string)-1;

for(i = 0; i<=l; i++){
 new_string[i] = string[l-i];
 printf("%c\n",new_string[i]);
    }
 printf("rev_number = %s\n",new_string);
}

输入:abcd

输出: original_number = abcd

d

c

b

一个

rev_number = dcba?

【问题讨论】:

  • char new_string[100]; --> char new_string[100]={0};
  • 哇! ,它成功了,你能告诉我背后的逻辑吗 char new_string[100]={0};
  • 由于new_string尚未初始化,所以显示垃圾。需要预先用0初始化或者在字符串后面加上null-terminator('\0')。

标签: c string


【解决方案1】:

你需要空终止你的字符串。 在你反转字符串的 for 循环之后添加这一行。

new_string[i]='\0';

for(i = 0; i<=l; i++){
   new_string[i] = string[l-i];
   printf("%c\n",new_string[i]);
}
new_string[i]='\0'; // add this 
printf("rev_number = %s\n",new_string);

check-here

【讨论】:

    【解决方案2】:

    for-loop 后用 new_string[i]='\0' 终止 new_string

    【讨论】:

      【解决方案3】:

      如果问题是“如何添加'?'到字符串的末尾?”我必须回答:

      1) 使用strcat 再添加一个字符,例如:

      #include<stdio.h>
      #include<string.h>
      int main(){
          char new_string[101] = {0}; // +1 to be sure that enough place for '?' will be available
                                      // {0} to init empty string
          char string[100];
          scanf("%s", string);
          printf("original_number = %s\n", string);
          int i;
          int l = strlen(string) - 1;
          for (i = 0; i <= l; i++){
              new_string[i] = string[l - i];
              printf("%c\n", new_string[i]);
          }
          strcat(new_string, "?");
          printf("rev_number = %s\n", new_string);
      }
      

      2) 在循环结束后放入? 并添加字符\0,例如:

      #include<stdio.h>
      #include<string.h>
      int main(){
          char new_string[101]; // +1 to be sure in place for '?'
          char string[100];
          scanf("%s", string);
          printf("original_number = %s\n", string);
          int i;
          int l = strlen(string) - 1;
          for (i = 0; i <= l; i++){
              new_string[i] = string[l - i];
              printf("%c\n", new_string[i]);
          }
          // add one more char
          new_string[i] = '?';
          // set the string end
          new_string[i + 1] = '\0';
          printf("rev_number = %s\n", new_string);
      }
      

      注意,如果你用0填充所有数组为char new_string[101] = {0};,你不需要用new_string[i + 1] = '\0';添加字符串结尾,所以如果初始化和第一个一样,第二个变体可以更短一个

      对于两个 sn-ps 我有相同的输出

      更新:

      关于使用字符串的更多建议。当使用scanf 进行输入并且您知道可以在字符数组中存储多少字符时,请使用以下方法来防止违反数组边界

      char string[10]; // if you have 10 bytes 
      scanf("%9s", string); // ask not more than 9 characters
      

      请记住,'\0'(空终止符)需要多一个字节。

      【讨论】:

        【解决方案4】:

        问题是您将“字符串结尾”作为 for 循环中的最后一个输入。您不需要变量“l”。你可以这样想

        int main()
        {
            char new_string[100];
            char string1[100];
            scanf("%s",string1);
            printf("original_number = %s\n",string1);
            int i;
        
        
            for(i = 0; i<=strlen(string1); i++){
             new_string[i] = string1[i-1];
        
             printf("%c\n",new_string[i]);
                }
             printf("rev_number = %s\n",new_string);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-16
          • 2015-10-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多